Java IO => BIO模式下端口转发思想(五)

Java IO => BIO模式下端口转发思想(五)

[toc]

目标

目标:BIO模式下的端口转发思想-服务端实现

服务端实现的需求

1、注册端口
2、接收客户端的socket连接,交给一个独立的线程来处理
3、把当前连接的客户端socket存入到一个所谓的在线socke集合中保存
4、接收客户端的消息,然后推送给当前所有在线的socket接收。

服务端代码

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 * 目标:BIO模式下的端口转发思想-服务端实现
 */
public class Server {
    // 定义一个静态集合
    public static List<Socket> allSocketOnLine = new ArrayList<>();
    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(9999);
            while (true){
                Socket socket = ss.accept();
                // 把登录的客户端socket存入到一个在线集合中去
                allSocketOnLine.add(socket);
                // 为当前登录成功的socket分配一个独立的线程来处理与之通信
                new ServerReaderThread(socket).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

服务端线程代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class ServerReaderThread extends Thread{

    private Socket socket;

    public ServerReaderThread(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            // 1、从socket中去获取当前客户端的输入流
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String msg;
            while ( (msg = br.readLine()) != null){
                // 2、服务端接收到了客户端的消息之后,是需要推送给当前所有的在线socket
                sendMsgToAllClient(msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("当前socket下线");
            Server.allSocketOnLine.remove(socket);
        }
    }

    /**
     * 把当前客户端发来的消息推送给全部在线的socket
     * @param msg
     */
    private void sendMsgToAllClient(String msg) {
        for (Socket sk : Server.allSocketOnLine){
            try {
                PrintStream ps = new PrintStream(sk.getOutputStream());
                ps.println(msg);
                ps.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容