拟一个多人聊天软件用于了解socket基础
首先是服务器端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;
public class MyServer {
//用于存储在线用户
public static ConcurrentHashMap<String,Socket> map = new ConcurrentHashMap<>();
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(30000);
while (true){
//此处线程阻塞,等待客户端连接服务端
Socket accept = serverSocket.accept();
new MyServerThread(accept).start();
}
}
}
同一时间会有多个客户端连接,所以服务端应该使用多线程
import java.io.*;
import java.net.Socket;
import java.util.Map;
public class MyServerThread extends Thread{
//客户端
private Socket socket;
//用户名
private String username;
public MyServerThread(Socket socket) {
this.socket = socket;
}
public void run(){
try {
//这里读取客户端发送来的信息,根据 ~ / 来判断发送来的信息类型
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = null;
while ((s=bufferedReader.readLine())!=null){
if (s.contains("~")){
MyServer.map.put(s.replace("~",""),socket);
}else{
String[] split = s.split("/");
username = split[0];
String message = split[1];
for (Map.Entry<String, Socket> stringSocketEntry : MyServer.map.entrySet()) {
String key = stringSocketEntry.getKey();
if (key.equals(username)){
Socket value = stringSocketEntry.getValue();
OutputStream outputStream = value.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
printStream.println(message);
}
}
}
}
} catch (IOException e) {
System.out.println(username+"已下线");
MyServer.map.remove(username);
}
}
}
客户端 client1跟2代码完全相同
import java.io.*;
import java.net.Socket;
public class MyClient1 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",30000);
new Thread(new CommonClientThread(socket)).start();
OutputStream outputStream = socket.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
String line = null;
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while ((line=bufferedReader.readLine())!=null){
printStream.println(line);
}
}
}
import java.io.*;
import java.net.Socket;
public class MyClient2 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1",30000);
new Thread(new CommonClientThread(socket)).start();
OutputStream outputStream = socket.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
String line = null;
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while ((line=bufferedReader.readLine())!=null){
printStream.println(line);
}
}
}
客户端需要读写线程分开,上方是写线程,下方是读线程
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class CommonClientThread implements Runnable{
private Socket socket;
public CommonClientThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
InputStream inputStream = null;
try {
inputStream = socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
try {
String content = null;
while ((content = bufferedReader.readLine()) != null) {
System.out.println(content);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
先启动MyServer 服务端 ,再启动MyClient1 跟MyClient2
client1 输入 1~ client2 输入 2~ 这样就注册到服务器了 1代表用户1 2代表用户2
此时用户1要跟用户2打招呼 只需要 输入用户名/信息 即 “2/你好”,此时用户2就收到了 “你好” 用户2收到信息后 回复给用户1 “1/嗨,你好” 此时用户1收到 “嗨,你好”