当前位置:网站首页>Bio model realizes multi person chat
Bio model realizes multi person chat
2022-07-06 06:55:00 【qq_ forty-four million one hundred and sixteen thousand five hu】
1、 Server side
package com.li.server;
import jdk.net.Sockets;
import javax.sound.sampled.Port;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
/**
* @author liyakun
*/
public class ChatServer {
private int DEFAULT_PORT = 8886;
private final String QUIT = "quit";
private ServerSocket serverSocket;
private Map<Integer, Writer> connectedClients;
public ChatServer() {
connectedClients = new HashMap<Integer, Writer>();
}
public synchronized void addClient(Socket socket) throws IOException {
if (socket != null) {
int port = socket.getPort();
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())
);
connectedClients.put(port, bufferedWriter);
System.out.println(" Port number :" + port + " Connected to server ");
}
}
public synchronized void removeServer(Socket socket) throws IOException {
if (socket != null) {
int port = socket.getPort();
if (connectedClients.containsKey(port)) {
connectedClients.get(port).close();
}
connectedClients.remove(port);
System.out.println(" client " + port + " Offline ");
}
}
public synchronized void forwardMessage(Socket socket, String fwdMsg) throws IOException {
for (Integer integer : connectedClients.keySet()) {
if (!integer.equals(socket.getPort())) {
Writer writer = connectedClients.get(integer);
writer.write(fwdMsg);
writer.flush();
}
}
}
/**
* Check whether the user exits
* @param msg
* @return
*/
public boolean readyToQuit(String msg) {
return QUIT.equals(msg);
}
public void close() {
if (serverSocket != null) {
try {
serverSocket.close();
System.out.println(" close serverSocket");
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void start() {
try {
serverSocket = new ServerSocket(DEFAULT_PORT);
System.out.println(" Server startup , Listening port " + DEFAULT_PORT);
while (true) {
// Wait for the client to connect
Socket socket = serverSocket.accept();
// establish chatHandler Threads
new Thread(new ChatHandler(this,socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
close();
}
}
public static void main(String[] args) {
ChatServer chatServer = new ChatServer();
chatServer.start();
}
}
package com.li.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* @author liyakun
*/
public class ChatHandler implements Runnable {
private ChatServer chatServer;
private Socket socket;
public ChatHandler(ChatServer chatServer, Socket socket) {
this.chatServer = chatServer;
this.socket = socket;
}
@Override
public void run() {
try {
// Store new online users
chatServer.addClient(socket);
// Read the information sent by the user
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg=null;
while ((msg=bufferedReader.readLine())!=null){
String fwdMsg=" client 【"+socket.getPort()+"]"+msg+"\n";
System.out.println(fwdMsg);
chatServer.forwardMessage(socket,fwdMsg);
// Check whether the user exits
if(chatServer.readyToQuit(msg)){
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
chatServer.removeServer(socket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2、 client
package com.li.client;
import java.io.*;
import java.net.Socket;
/**
* @author liyakun
*/
public class ChatClient {
private final String DEFAULT_SERVER_HOST = "127.0.0.1";
private final int DEFAULT_SERVER_PORT = 8886;
private final String QUIT = "quit";
private Socket socket;
private BufferedReader reader;
private BufferedWriter writer;
// Send information to the server
public void send(String msg) throws IOException {
if (!socket.isOutputShutdown()) {
writer.write(msg + "\n");
writer.flush();
}
}
public String receive() throws IOException {
String msg = null;
if (!socket.isInputShutdown()) {
msg = reader.readLine();
}
return msg;
}
// Check whether the user is ready to exit
public boolean readyToQuit(String msg) {
return QUIT.equals(msg);
}
public void close() {
if (writer != null) {
try {
System.out.println(" close socket");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void start() {
try {
// establish socket
socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT);
// establish IO flow
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// Processing user input
new Thread(new UserInputHandler(this)).start();
// Read the information forwarded by the server
String msg = null;
while ((msg = receive()) != null) {
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ChatClient chatClient = new ChatClient();
chatClient.start();
}
}
package com.li.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author liyakun
*/
public class UserInputHandler implements Runnable {
private ChatClient chatClient;
public UserInputHandler(ChatClient chatClient) {
this.chatClient = chatClient;
}
@Override
public void run() {
try {
// Waiting for user input
BufferedReader consoleReader =
new BufferedReader(new InputStreamReader(System.in));
while (true) {
String input = consoleReader.readLine();
// Send a message to the server
chatClient.send(input);
// Check whether the user is ready to exit
if (chatClient.readyToQuit(input)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、 test :
stay IDEA Running server in , And open multiple clients ( Opening method editConfigurations------>Allow parallel run), You can test successfully .
边栏推荐
- PCL realizes frame selection and clipping point cloud
- A method to measure the similarity of time series: from Euclidean distance to DTW and its variants
- Day 245/300 JS foreach data cannot be updated to the object after multi-layer nesting
- At the age of 26, I changed my career from finance to software testing. After four years of precipitation, I have been a 25K Test Development Engineer
- Three methods of adding color to latex text
- How to convert flv file to MP4 file? A simple solution
- 成功解决TypeError: data type ‘category‘ not understood
- Suspended else
- mysql的基础命令
- The internationalization of domestic games is inseparable from professional translation companies
猜你喜欢
19. Actual memory management of segment page combination
Chapter 7 - thread pool of shared model
开源的网易云音乐API项目都是怎么实现的?
我的创作纪念日
SQL Server manager studio(SSMS)安装教程
攻防世界 MISC中reverseMe简述
AttributeError: Can‘t get attribute ‘SPPF‘ on <module ‘models.common‘ from ‘/home/yolov5/models/comm
机器学习植物叶片识别
[ 英语 ] 语法重塑 之 英语学习的核心框架 —— 英语兔学习笔记(1)
Do you really know the use of idea?
随机推荐
My seven years with NLP
Pymongo gets a list of data
Day 246/300 ssh连接提示“REMOTE HOST IDENTIFICATION HAS CHANGED! ”
Development of entity developer database application
Proteus -- Serial Communication parity flag mode
【Hot100】739. Daily temperature
基于购买行为数据对超市顾客进行市场细分(RFM模型)
Practical guidance for interface automation testing (Part I): what preparations should be made for interface automation
How to convert flv file to MP4 file? A simple solution
[advanced software testing step 1] basic knowledge of automated testing
SQL Server Manager studio (SSMS) installation tutorial
Leetcode - 152 product maximum subarray
Simple query cost estimation
Data security -- 13 -- data security lifecycle management
Apache DolphinScheduler源码分析(超详细)
简单描述 MySQL 中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面)
Lesson 7 tensorflow realizes convolutional neural network
我的创作纪念日
pymongo获取一列数据
Apache dolphin scheduler source code analysis (super detailed)