client端代码如下:
public class Client {
private static int SERVER_PORT = 10000; //默认服务器端口号
private static String SERVER_IP = "127.0.0.1";//服务器ip
private static Scanner scan;
private static Socket socket;//客户端服务
private static String name;//客户端名称
public static void main(String[] args) throws IOException {
socket = new Socket(SERVER_IP, SERVER_PORT);
scan = new Scanner(System.in);
System.out.println("客户端已启动");
System.out.println("请取名:");
name = scan.nextLine();//客户端取名
new Send(name, socket).start();//创建线程向服务器发送消息
new Receive(socket).start();//创建一个线程接受服务端消息
}
static class Send extends Thread {
private static PrintWriter outputStream;
private String massage;
private String name;
private Socket socket;
public Send(String name, Socket socket) throws IOException {
this.name = name;
this.socket = socket;
}
@Override
public void run() {
try {
outputStream = new PrintWriter(socket.getOutputStream(), true);//发送消息,自动刷新
} catch (IOException e) {
e.printStackTrace();
}
outputStream.println(name);
while (true) {
System.out.println("请输入:");
massage = scan.nextLine();
outputStream.println(massage);
}
}
}
static class Receive extends Thread {
private Socket socket;
private BufferedReader inputStream;
public Receive(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
inputStream = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
while (true) { //循环接收消息
try {
String str = inputStream.readLine();
System.out.println(str);//读取服务端返回的消息
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
sever端代码:
public class Server {
private static int SERVER_PORT = 10000;//服务器将要监听的端口号
private static ServerSocket sever;
private static ExecutorService service;
private static BufferedReader in;
private static HashMap<String, Socket> hashMap;
public static void main(String[] args) throws IOException {
start(SERVER_PORT);
}
private static void start(int port) throws IOException {
Socket socket;
sever = new ServerSocket(port);//监听端口
service = Executors.newFixedThreadPool(5);
hashMap = new HashMap<>();
System.out.println("服务端已启动");
while (true) {//通过无限循环监听端口
socket = sever.accept();//监听是否有服务端连接
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String name = in.readLine();//读取客户端名称
System.out.println(name + "进入");
hashMap.put(name, socket);
service.execute(new ServerThread(socket, hashMap,name));
}
}
}
服务器端线程类(用于执行监听到的任务):
public class ServerThread extends Thread {
private Socket socket;//保存监听到的有需求的客户端
private HashMap<String, Socket> hashMap;
private String sendName;
public ServerThread(Socket socket, HashMap hashMap,String sendName) throws IOException {
this.socket = socket;
this.hashMap = hashMap;
this.sendName=sendName;
}
@Override
public void run() {
try {
receive();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void receive() throws IOException {
String massage;
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) { //循环接收消息
massage = in.readLine();
send(massage);//服务器收到的消息转发
}
}
public void send(String massage) throws IOException {
int i = massage.indexOf("@");
String name= massage.substring(i + 1, massage.length());
//遍历map
Socket s = hashMap.get(name);
if (s == null) {
socket.getOutputStream().write("用户不存在\n".getBytes());
socket.getOutputStream().flush();
return;
}
s.getOutputStream().write((sendName+":"+massage.substring(0, i)+"\n").getBytes());//将消息发给客户端
socket.getOutputStream().flush();
}
}