本文梳理一个基础的java TCP消息通信,构造一个简单的Packet进行传输,代码如下:
- Packet
public class Packet { private String attribute; public Packet(String attr){ this.attribute = attr; } public String getAttribute() { return attribute; } public void setAttribute(String attribute) { this.attribute = attribute; } }
- 服务器端代码
public class App { private static final int PORT = 4000; public static void main(String[] args) throws IOException { ServerSocket listen = new ServerSocket(PORT); Socket client = null; while(true){ client = listen.accept(); new Thread(new ServerThread(client)).start(); } } }
public class ServerThread implements Runnable{ private static final int BUFSIZE =1024; private Socket client = null; public ServerThread(Socket client){ this.client = client; } @Override public void run() { try { InputStream in = client.getInputStream(); OutputStream out = client.getOutputStream(); byte[] buffer = new byte[BUFSIZE]; while (in.read(buffer) != -1) { //判断包头 if(buffer[0] == 0x01 && buffer[1] == 0x02){ byte[] tmp = new byte[BUFSIZE]; int index = 0; for(int i = 2; i < buffer.length; i++){ tmp[index++] = buffer[i]; } Packet packet = new Packet(new String(tmp,"GB2312")); System.out.println(packet.getAttribute()); }else{ System.out.println("消息格式不正确"); } } out.close(); in.close(); } catch (IOException e) { e.printStackTrace(); } } }
- 客户端代码
public class App { private static final int PORT = 4000; private static final int BUFSIZE =1024; public static void main(String[] args) throws IOException { Socket client = new Socket("127.0.0.1", PORT); InputStream in = client.getInputStream(); OutputStream out = client.getOutputStream(); Packet packet = new Packet("类型参数2345"); byte[] output = new byte[BUFSIZE]; output[0] = 0x01; output[1] = 0x02; int index = 2; //若增加包长度字段,则可实现packet的分包、组包 byte[] tmp1 = packet.getAttribute().getBytes(); for(int i= 0; i < tmp1.length; i++){ output[index++] = tmp1[i]; } out.write(output); byte[] buffer = new byte[BUFSIZE]; while (in.read(buffer) != -1) { System.out.println(new String(buffer, "GB2312")); } out.close(); in.close(); client.close(); } }