java socket通信:从客户端传入一个循环数组写到输出流中,服务器不断的接受客户端数字然后动态的显示
1.客户端 client01
package socket01; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class client01 { public static void main(String[] args) { // TODO Auto-generated method stub Socket socket = null; PrintWriter pw = null; int arr[] = { 10, 23, 56, 96, 20, 31, 46, 65, 52, 1, 25, 12, 162, 186, 55, 63, 55, 96, 92, 6, 55, 33, 5, 11, 5, 16, 41 }; try { } catch (Exception e) { e.printStackTrace(); } finally { try { // 客户端socket指定服务器的地址和端口号 socket = new Socket("10.128.47.166", 3342); pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); while (true) { for (int i = 0; i < arr.length; i++) { pw.println(arr[i]);// println方法相当于write方法 pw.flush(); } } } catch (IOException e) { e.printStackTrace(); } finally { try { pw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
1.服务端 sever01
package socket01; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.JFrame; import javax.swing.JPanel; public class sever01 extends JPanel { // TODO Auto-generated method stub ServerSocket s = null; Socket socket = null; BufferedReader br = null; private List<Integer> values; private static final int MAX_VALUE = 80;// 接受到数据的最大值 private static final int MAX_COUNT_OF_VALUES = 50;// 最多保存数据的个数 // 构造器搞起 public sever01() { values = Collections.synchronizedList(new ArrayList<Integer>()); new Thread(new Runnable() { public void run() { try { // 设定服务端的端口号 s = new ServerSocket(3342); System.out.println("ServerSocket Start:" + s); // 等待请求,此方法会一直阻塞,直到获得请求才往下走 socket = s.accept(); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 用于发送返回信息,可以不需要装饰这么多io流使用缓冲是发送数据要注意调用.flush()方法 while (true) { for (int i = 0; i < 50; i++) { String ss = br.readLine(); repaint(); values.add(Integer.parseInt(ss)); Thread.sleep(200); } } } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("Close...."); try { br.close(); socket.close(); s.close(); } catch (Exception e2) { e2.printStackTrace(); } } } }).start(); } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; Color c = new Color(200, 70, 0); g.setColor(c); // 要绘制平滑点曲线 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); int w = getWidth();// 数据在整个屏幕中的宽度 int h = getHeight();// 数据波形的高度 int xDelta = w / MAX_COUNT_OF_VALUES; int length = values.size(); for (int i = 0; i < length - 1; ++i) { g2d.drawLine(xDelta * (MAX_COUNT_OF_VALUES - length + i), normalizeValueForYAxis(values.get(i), h), xDelta * (MAX_COUNT_OF_VALUES - length + i + 1), normalizeValueForYAxis(values.get(i + 1), h)); } } private int normalizeValueForYAxis(int value, int height) { return (int) ((double) height / MAX_VALUE * value); } private static void createGuiAndShow() { JFrame frame = new JFrame("socket 接受数据界面显示"); frame.getContentPane().add(new sever01()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 400); frame.setLocationRelativeTo(null); frame.setVisible(true); } public static void main(String[] args) { createGuiAndShow(); } }
