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();
}
}
}
}