socket网络通信

来源:互联网 发布:linux 创建新文件 编辑:程序博客网 时间:2024/06/05 16:00

1.场景还原

   近期,一直忙着研究web与硬件交互的链接类,该连接是基于Tcp/Ip的socket通信。原本想采用mina通信框架,最后选择了最原始的socket通信。

2.实现方案

①服务器端代码

public class Server {    public static final int PORT = 12345;//监听的端口号    public static void main(String[] args) {        System.out.println("服务器启动...\n");        Server server = new Server();        server.init();    }    public void init() {        try {            ServerSocket serverSocket = new ServerSocket(PORT);            while (true) {                // 一旦有堵塞, 则表示服务器与客户端获得了连接                Socket client = serverSocket.accept();                // 处理这次连接                new HandlerThread(client);            }        } catch (Exception e) {            System.out.println("服务器异常: " + e.getMessage());        }    }    private class HandlerThread implements Runnable {        private Socket socket;        public HandlerThread(Socket client) {            socket = client;            new Thread(this).start();        }        public void run() {            try {                // 读取客户端数据                DataInputStream input = new DataInputStream(socket.getInputStream());                String clientInputStr = input.readUTF();//这里要注意和客户端输出流的写方法对应,否则会抛 EOFException                // 处理客户端数据                System.out.println("客户端说:" + clientInputStr);                // 向客户端回复信息                DataOutputStream out = new DataOutputStream(socket.getOutputStream());                System.out.print("请输入:\t");                // 发送键盘输入的一行                String s = new BufferedReader(new InputStreamReader(System.in)).readLine();                out.writeUTF(s);                out.close();                input.close();            } catch (Exception e) {                System.out.println("服务器 run 异常: " + e.getMessage());            } finally {                if (socket != null) {                    try {                        socket.close();                    } catch (Exception e) {                        socket = null;                        System.out.println("服务端 finally 异常:" + e.getMessage());                    }                }            }        }    }}
②客户端代码

public class Client {    public static final String IP_ADDR = "localhost";//服务器地址    public static final int PORT = 12345;//服务器端口号    public static void main(String[] args) {        System.out.println("客户端启动...");        System.out.println("当接收到服务器端字符为 \"OK\" 的时候, 客户端将终止\n");        while (true) {            Socket socket = null;            try {                //创建一个流套接字并将其连接到指定主机上的指定端口号                socket = new Socket(IP_ADDR, PORT);                synchronized(socket) {                    System.out.println("socket:: " + socket.hashCode());                    //允许访问控制的代码                    //读取服务器端数据                    DataInputStream input = new DataInputStream(socket.getInputStream());                    //向服务器端发送数据                    DataOutputStream out = new DataOutputStream(socket.getOutputStream());                    System.out.print("请输入: \t");                    String str = new BufferedReader(new InputStreamReader(System.in)).readLine();                    out.writeUTF(str);                    String ret = input.readUTF();                    System.out.println("服务器端说: " + ret);                    // 如接收到 "OK" 则断开连接                    if ("OK".equals(ret)) {                        System.out.println("客户端将关闭连接");                        Thread.sleep(500);                        break;                    }                    out.close();                    input.close();                }            } catch (Exception e) {                System.out.println("客户端异常:" + e.getMessage());            } finally {                if (socket != null) {                    try {                        socket.close();                    } catch (IOException e) {                        socket = null;                        System.out.println("客户端 finally 异常:" + e.getMessage());                    }                }            }        }    }}
为了解决高并发,我在客户端中加了一个socket的同步锁代码块

效果:


③socket的原理分析

1.连接---3次握手


2.断开---4次挥手


性能有待改进,我是张星,欢迎关注,后期更精彩。

原创粉丝点击