java代码 个人聊天室1. 可使用文字聊天 2. 可以发送文件 3. 可以私聊

时间: 2024-02-22 18:59:39 浏览: 18
好的,下面是一个简单的Java代码示例,实现了个人聊天室的以下功能: 1. 可以使用文字聊天 2. 可以发送文件 3. 可以私聊 服务端代码: ```java import java.io.*; import java.net.*; import java.util.*; public class Server { private static List<ClientHandler> clients = new ArrayList<>(); public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8000); System.out.println("Server started."); while (true) { Socket socket = server.accept(); System.out.println("Client connected: " + socket); ClientHandler clientHandler = new ClientHandler(socket); clients.add(clientHandler); clientHandler.start(); } } public static void broadcast(String message, ClientHandler sender) { for (ClientHandler client : clients) { if (client != sender) { client.sendMessage(message); } } } public static void sendPrivateMessage(String message, String recipient, ClientHandler sender) { for (ClientHandler client : clients) { if (client.getUsername().equals(recipient)) { client.sendMessage("[" + sender.getUsername() + "]: " + message); } } } public static void removeClient(ClientHandler clientHandler) { clients.remove(clientHandler); } } class ClientHandler extends Thread { private Socket socket; private BufferedReader in; private PrintWriter out; private String username; public ClientHandler(Socket socket) throws IOException { this.socket = socket; in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); } @Override public void run() { try { out.println("Enter your username:"); username = in.readLine(); out.println("Welcome, " + username + "!"); String input; while ((input = in.readLine()) != null) { if (input.startsWith("/private")) { String[] tokens = input.split(" "); String recipient = tokens[1]; String message = input.substring(recipient.length() + 10); Server.sendPrivateMessage(message, recipient, this); } else if (input.startsWith("/file")) { String[] tokens = input.split(" "); String recipient = tokens[1]; String filename = tokens[2]; int fileSize = Integer.parseInt(tokens[3]); byte[] fileData = new byte[fileSize]; InputStream is = socket.getInputStream(); FileOutputStream fos = new FileOutputStream(filename); BufferedOutputStream bos = new BufferedOutputStream(fos); int bytesRead = is.read(fileData, 0, fileData.length); bos.write(fileData, 0, bytesRead); bos.flush(); bos.close(); Server.sendPrivateMessage("[File: " + filename + " received]", recipient, this); } else { Server.broadcast("[" + username + "]: " + input, this); } } } catch (IOException e) { System.err.println("Error handling client: " + e); } finally { try { socket.close(); } catch (IOException e) { System.err.println("Error closing socket: " + e); } Server.removeClient(this); } } public void sendMessage(String message) { out.println(message); } public String getUsername() { return username; } } ``` 客户端代码: ```java import java.io.*; import java.net.*; import java.util.Scanner; public class Client { private static String username; public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 8000); System.out.println("Connected to server."); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // Read username from console and send to server Scanner scanner = new Scanner(System.in); System.out.print("Enter your username: "); username = scanner.nextLine(); out.println(username); String serverMessage; while ((serverMessage = in.readLine()) != null) { System.out.println(serverMessage); if (serverMessage.startsWith("Welcome,")) { break; } } // Start a new thread to handle incoming messages from the server Thread thread = new Thread(new ServerHandler(socket)); thread.start(); // Read messages from console and send to server while (true) { String message = scanner.nextLine(); if (message.startsWith("/private")) { out.println(message); } else if (message.startsWith("/file")) { String[] tokens = message.split(" "); String recipient = tokens[1]; String filename = tokens[2]; File file = new File(filename); byte[] fileData = new byte[(int) file.length()]; FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis); bis.read(fileData, 0, fileData.length); out.println("/file " + recipient + " " + filename + " " + fileData.length); OutputStream os = socket.getOutputStream(); os.write(fileData, 0, fileData.length); os.flush(); System.out.println("File sent."); } else { out.println(message); } } } } class ServerHandler implements Runnable { private Socket socket; public ServerHandler(Socket socket) { this.socket = socket; } @Override public void run() { try { BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String serverMessage; while ((serverMessage = in.readLine()) != null) { System.out.println(serverMessage); } } catch (IOException e) { System.err.println("Error handling server message: " + e); } } } ``` 这个示例代码使用了多线程来处理每个客户端的输入和输出,以及服务器端的广播和私聊消息。你可以在此基础上进行进一步的开发和改进,例如增加用户列表、禁言功能等。

相关推荐

最新推荐

recommend-type

python实现简单聊天室功能 可以私聊

主要为大家详细介绍了python实现简单聊天室功能,可以进行私聊,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

java实现聊天室功能(全部代码,有界面)

java写的聊天室程序,支持群聊,公聊,私聊,支持刷新好友列表,使用swing以及awt写的简单界面,可以多人登录
recommend-type

JSP聊天室毕业论文(jsp+javabean).doc

功能:本系统的操作人员可分为用户和管理员,其中用户登录后可以进行的操作是:选择聊天室,然后可以选择聊天的动作和表情,加上字体的颜色,对全部在线用户群聊,或者单独的一个用户私聊,可以为大家共享文件;...
recommend-type

vue获取当前IP所在地天气.docx

原生的vue源代码,使用vue获取当前IP,并且获取到当前所在地天气.docx,亲测有效,有问题可一直私聊我
recommend-type

在考研复试给导师的个人简历.docx

这是本人在下载别人的个人简历过后,发布出来的,别人那么烂的就能15个币气死我了,我这就一个,一个币,有要求私聊。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】MATLAB用遗传算法改进粒子群GA-PSO算法

![MATLAB智能算法合集](https://static.fuxi.netease.com/fuxi-official/web/20221101/83f465753fd49c41536a5640367d4340.jpg) # 2.1 遗传算法的原理和实现 遗传算法(GA)是一种受生物进化过程启发的优化算法。它通过模拟自然选择和遗传机制来搜索最优解。 **2.1.1 遗传算法的编码和解码** 编码是将问题空间中的解表示为二进制字符串或其他数据结构的过程。解码是将编码的解转换为问题空间中的实际解的过程。常见的编码方法包括二进制编码、实数编码和树形编码。 **2.1.2 遗传算法的交叉和
recommend-type

openstack的20种接口有哪些

以下是OpenStack的20种API接口: 1. Identity (Keystone) API 2. Compute (Nova) API 3. Networking (Neutron) API 4. Block Storage (Cinder) API 5. Object Storage (Swift) API 6. Image (Glance) API 7. Telemetry (Ceilometer) API 8. Orchestration (Heat) API 9. Database (Trove) API 10. Bare Metal (Ironic) API 11. DNS
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。