【通信与框架】Socket原理

一、原理

二、代码实现

server端代码

package com.hadoop.bd.NetworkCommunication;

import com.sun.security.ntlm.Server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @Author He Bao Jing
 * @Date 2019-03-03 10:53
 */
public class SocketServerDemo {
    public static void main(String[] args) {
        int port = 9999;
        improveServer(port);
    }

    private static void improveServer(int port) {
        ExecutorService threadPool = Executors.newFixedThreadPool(10);
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(port);
            while (true) {
                final Socket socket = serverSocket.accept();
                System.out.println("server accept the client connection!");
                threadPool.submit(new Runnable() {
                    public void run() {
                        try {
                            InputStream inputStream = socket.getInputStream();
                            StringBuilder sb = new StringBuilder();
                            int len;
                            byte[] bytes = new byte[2014];
                            while ((len = inputStream.read(bytes)) != -1) {
                                sb.append(new String(bytes, 0, len, "UTF-8"));
                            }
                            System.out.println(Thread.currentThread().getName() + ", Client: " + sb.toString());

                            OutputStream outputStream = socket.getOutputStream();
                            outputStream.write("I am server".getBytes("UTF-8"));


                            inputStream.close();
                            outputStream.close();

                            socket.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void primaryServer(int port) {
        try {
            ServerSocket serverSocket = new ServerSocket(port);
            Socket socket = serverSocket.accept();
            InputStream inputStream = socket.getInputStream();

            byte[] byteArray = new byte[1024];
            int len;
            StringBuilder sb = new StringBuilder();

            // 只有客户端关闭输出流时,服务端才能获取到末尾的-1
            while ((len = inputStream.read(byteArray)) != -1) {
                sb.append(new String(byteArray, 0, len, "UTF-8"));
            }
            System.out.println("Client: " + sb.toString());
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("Hello, Client, I have received from you!".getBytes("UTF-8"));

            inputStream.close();
            outputStream.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Client端代码

package com.hadoop.bd.NetworkCommunication;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * @Author He Bao Jing
 * @Date 2019-03-03 10:53
 */
public class SocketClientDemo {
    public static void main(String[] args) {
        int port = 9999;
        String host = "127.0.0.1";

        for (int i = 0; i < 8; i++) {
            try {
                Socket socket = new Socket(host, port);
                OutputStream outputStream = socket.getOutputStream();
                String message = "I am client" + i;
                outputStream.write(message.getBytes());

                // 关闭输出流,后续只能接收数据;如果没有此处,服务端无法接收到-1,即服务端会阻塞
                socket.shutdownOutput();

                InputStream inputStream = socket.getInputStream();
                byte[] byteArray = new byte[1024];
                int len;
                StringBuilder sb = new StringBuilder();
                while ((len = inputStream.read(byteArray)) != -1) {
                    sb.append(new String(byteArray, 0, len, "UTF-8"));
                }
                System.out.println("Server: " + sb.toString());

                inputStream.close();
                outputStream.close();
                socket.close();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

三、引用

https://www.cnblogs.com/yiwangzhibujian/p/7107785.html

猜你喜欢

转载自blog.csdn.net/hebaojing/article/details/88092016