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();
}
}