java 网络(socket)

本文梳理一个基础的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();
            
    }
}
posted @ 2015-06-16 14:24  Fredric_2013  阅读(150)  评论(0编辑  收藏  举报