import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入虚拟账号");
String account = sc.nextLine();
try {
Socket socket = new Socket("localhost", 8888);
OutputStream os = socket.getOutputStream();
PrintStream pw = new PrintStream(os);
pw.println(account);
pw.flush();
new ReaderThread(socket).start();
new WriteThread(socket).start();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
/**
* 服务端
*/
public class ChatServer {
public static Map<String, Socket> socketMap = new HashMap<>();
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(8888);
System.out.println("聊天服务器已启动,等待客户端的连接");
while (true) {
Socket socket = server.accept();
System.out.println("连接完毕");
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String account = br.readLine();
System.out.println("读取到的账号:" + account);
socketMap.put(account, socket);
new ChatThread(socket).start();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
import java.io.*;
import java.net.Socket;
import java.util.Map;
import java.util.Set;
/**
* 聊天的线程
*/
public class ChatThread extends Thread {
private Socket socket;
public ChatThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
while (true) {
try {
InputStream is = this.socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String message = br.readLine();
System.out.println("读取到的用户信息为:" + message);
String[] values = message.split("-");
Map<String, Socket> socketMap = ChatServer.socketMap;
Set<String> keySet = socketMap.keySet();
if (values.length == 1) { // 群发
for (String account : keySet) {
Socket socket2 = socketMap.get(account);
if (this.socket != socket2) { // 不用给自己发
OutputStream os = socket2.getOutputStream();
PrintStream pw = new PrintStream(os);
pw.println(message);
pw.flush();
}
}
} else { // 单聊
String account = values[0]; // 接受信息的人
Socket socket2 = socketMap.get(account);
OutputStream os = socket2.getOutputStream();
PrintStream pw = new PrintStream(os);
pw.println(values[1]);
pw.flush();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
/**
* 写入的线程
*/
public class WriteThread extends Thread {
private Socket socket;
public WriteThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
while (true) {
try {
OutputStream os = socket.getOutputStream();
PrintStream pw = new PrintStream(os);
Scanner sc = new Scanner(System.in);
System.out.println("请输入聊天内容:");
String message = sc.nextLine();
pw.println(message);
pw.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* 读取的线程
*/
public class ReaderThread extends Thread {
private Socket socket;
public ReaderThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
while (true) {
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = br.readLine();
System.out.println("客服端读取到的信息:" + line);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}