用java实现简单聊天系统具体实现,要求1.有用户昵称2.显示聊天时间
时间: 2024-03-10 12:47:26 浏览: 58
基于JAVA的聊天系统的设计与实现.doc
5星 · 资源好评率100%
下面是一个基于Java的简单聊天系统的实现,实现用户昵称和显示聊天时间的功能:
服务器端:
```java
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.*;
public class Server {
private static final int PORT = 8888;
private static List<Socket> clientList = new ArrayList<>(); // 存储客户端连接的列表
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 时间格式化对象
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("服务器已启动,等待客户端连接...");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("客户端 " + clientSocket.getInetAddress().getHostAddress() + " 已连接!");
clientList.add(clientSocket);
new Thread(new ClientHandler(clientSocket)).start(); // 为每个客户端分配一个线程
}
}
// 广播消息给所有客户端
public static void broadcast(String message) {
for (Socket client : clientList) {
try {
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
out.println(message);
} catch (IOException e) {
System.out.println("广播消息失败!" + e.getMessage());
}
}
}
// 内部类,为每个客户端分配一个线程
private static class ClientHandler implements Runnable {
private Socket clientSocket;
private String nickName;
private String time;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// 读取客户端昵称
nickName = in.readLine();
broadcast(nickName + " 上线了!");
String inputLine;
while ((inputLine = in.readLine()) != null) {
time = sdf.format(new Date()); // 获取当前时间
broadcast("[" + time + "] " + nickName + ": " + inputLine);
}
in.close();
clientSocket.close();
clientList.remove(clientSocket);
broadcast(nickName + " 已下线!");
} catch (IOException e) {
System.out.println("客户端连接断开!" + e.getMessage());
}
}
}
}
```
客户端:
```java
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Client {
private static final String SERVER_IP = "127.0.0.1";
private static final int SERVER_PORT = 8888;
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
System.out.print("请输入昵称:");
String nickName = sc.nextLine();
Socket socket = new Socket(SERVER_IP, SERVER_PORT);
System.out.println("连接服务器成功!");
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 发送昵称到服务器
out.println(nickName);
// 接收服务器消息并打印
new Thread(new Runnable() {
@Override
public void run() {
String inputLine;
try {
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
} catch (IOException e) {
System.out.println("接收服务器消息失败!" + e.getMessage());
}
}
}).start();
// 读取用户输入并发送给服务器
String userInput;
while ((userInput = sc.nextLine()) != null) {
out.println(userInput);
}
out.close();
in.close();
socket.close();
}
}
```
在这个实现中,当客户端连接到服务器时,需要输入一个昵称,然后将昵称发送到服务器。服务器会存储每个客户端的连接,当有客户端发送消息时,服务器会将消息广播给所有的客户端。在广播消息时,服务器会在消息前面加上时间和客户端昵称。客户端接收到服务器消息后,直接打印即可。
注意,这个实现中的时间格式化对象是线程不安全的,如果需要在多线程中使用,需要使用ThreadLocal对象来保证线程安全。
阅读全文