BIO编程模型
BIO多人聊天
服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
/**
* Created 多人聊天服务端 on 2020/6/28.
*/
public class ChatServer {
private int DEFAULT_PORT = 8888;
private final String QUIT = "quit";
private ServerSocket serverSocket = null;
private Map<Integer,Writer> clients =null;
public ChatServer() throws IOException {
clients = new HashMap<>();
}
//添加客户端
public void addClient(Socket socket) throws IOException {
if(socket!= null){
int port = socket.getPort();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
clients.put(port,bufferedWriter);
System.out.println("客户端"+port+":加入到了服务端");
}
}
//删除客户端
public void removeClient(Socket socket) throws IOException {
if(socket!= null){
int port = socket.getPort();
if( clients.containsKey(port) ){
clients.get(port).close();
}
clients.remove(port);
System.out.println("客户端"+port+":从服务端移除");
}
}
//转发信息给其他客户端
public void forwardMsg(String msg,Socket socket) throws IOException {
System.out.println("转发给其它客户端"+msg);
int port = socket.getPort();
for( int clientPort: clients.keySet()){
if( port != clientPort){
Writer writer = clients.get(clientPort);
writer.write(msg);
writer.flush();
}
}
}
//服务端启动
public void start() {
try {
serverSocket = new ServerSocket(DEFAULT_PORT);
System.out.println("服务器开始启动默认监听端口"+DEFAULT_PORT);
while(true){
//开处理客户连接的任务线程
Socket socket = serverSocket.accept();
new Thread(new ChatHandler(this,socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
new ChatServer().start();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* Created by Founder on 2020/6/28.
*/
public class ChatHandler implements Runnable{
private ChatServer chatServer;
private Socket socket ;
private final String QUIT ="quit" ;
public ChatHandler(ChatServer chatServer, Socket socket ){
this.chatServer = chatServer;
this.socket = socket ;
}
@Override
public void run() {
System.out.println("客户端"+socket.getPort()+"已经连接");
try {
chatServer.addClient(socket);
//读取客户端的信息
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg =null;
while ((msg=reader.readLine())!=null){
String clientMsg = "客户端"+socket.getPort()+"发送了一条消息:"+msg;
System.out.println(clientMsg);
//将消息转发给其它客户端
chatServer.forwardMsg(msg,socket);
//查看用户是否要退出
if(readeyToQuit(msg)){
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public boolean readeyToQuit(String msg){
return QUIT.equals(msg);
}
}
客户端
import java.io.*;
import java.net.Socket;
/**
* Created 客户端 2020/6/28.
*/
public class ChatClient {
final String QUIT = "quit" ;
final String DEFAULT_SERVER_HOST = "127.0.0.1";
final int DEFAULT_PORT = 8888;
Socket socket = null;
private BufferedReader reader;
private BufferedWriter writer;
//发送消息给服务器
public void send(String msg) throws IOException {
System.out.println("发送给服务器"+msg);
if(!socket.isOutputShutdown()){
writer.write(msg+"\n");
writer.flush();
}
}
//接受消息从服务器
public String recive() throws IOException {
if(!socket.isInputShutdown()){
String msg = reader.readLine();
System.out.println("从服务器接受"+msg);
return msg;
}
return null;
}
//检查用户是否退出
public boolean readToQuit(String msg){
return QUIT.equals(msg);
}
//启动客户端
public void start(){
try {
socket = new Socket(DEFAULT_SERVER_HOST,DEFAULT_PORT);
System.out.println("客户端开始启动默认端口"+DEFAULT_PORT);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//处理客户端的输入
new Thread(new UserInputHandler(this)).start();
//读取服务器转发的消息
String msg = null;
while(((msg = recive() )!= null)){
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ChatClient().start();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* Created 用户输入处理 2020/6/28.
*/
public class UserInputHandler implements Runnable{
final String QUIT = "quit" ;
private ChatClient chatClient;
public UserInputHandler( ChatClient chatClient ){
this.chatClient = chatClient ;
}
@Override
public void run() {
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
while (true){
//先发给服务端
try {
chatClient.send(consoleReader.readLine());
chatClient.readToQuit(consoleReader.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}