java编写聊天室_如何用java写一个聊天室?

本文介绍了如何利用Java的Swing创建图形界面,结合TCP连接(IO或NIO)技术来构建一个聊天室。首先,服务端开启指定端口的ServerSocket,监听并接受客户端连接,保存每个客户端的用户名和连接。当收到客户端消息时,广播到所有连接。客户端则通过输入IP和端口连接服务器,发送用户名,并持续接收和显示服务器消息。注意异常处理和关闭连接的时机,确保程序稳定性。
摘要由CSDN通过智能技术生成

虽然Java不适合桌面应用的开发 但是肯定还是有办法哒

本回答针对已经会Java Awt/Swing或其他框架 并且会Java IO/NIO技术的童鞋~

我们不妨先设计一个思路: 客户端图形界面最简单的使用Swing技术 通讯使用TCP连接 (Java IO或者Java NIO)

服务端先显示一个窗口 根据输入的端口号来开一个ServerSocket 绑定到这个端口

接着我们在服务端上无限循环地接收客户端的连接请求(accept方法)

每当我们接到一个连接请求的时候 我们给该客户端建立一个新的 我们要和客户端达成一个协议 就是连接后 由客户端发出服务端接收的第一次信息 客户端告知自己的用户名(当然你也可以每次客户端发送消息的时候都用一个分隔符将自己的用户名和消息使用分隔符分开来直接解析) 获得用户名之后将该用户名和套接字还有其他的连接都保存起来 保存到一个集合 在这个新的线程中 不断地接收客户端发来的消息 每当读取到一条消息后 我们向集合内的所有连接发送一个消息 就比如xxx发送了xxx消息

最后 为了避免僵尸进程 在客户端关闭套接字或者意外断开连接的时候 我们要将其关闭

我们通过SocketChannel或InputStream读取时 如果对面没有发来消息 正常情况下该read请求是会阻塞线程的 所以记得!要给读取的工作新开一个线程! 如果没有阻塞且如果返回值是-1 (如果是BufferedReader会返回null) 则代表客户端已将该连接关闭 此时我们也应当将连接关闭 并将其从集合中移除 将该连接的对应线程做中断处理 如果是NIO就很简单 它会直接帮你抛出异常让你做下一步操作 但是如果是旧IO 那就需要自己做判断咯

如果说我们读取信息时报出了IOException异常 就代表连接意外终止了 此时也应该将连接关闭并终止对应线程

客户端方面 和服务端一样 我们先弹出一个窗口 需要先弹窗 根据输入的IP地址和端口进行连接到对应的服务器

若连接成功 就可以新开一个窗口 放进一个滚动文本框和一个输入框 此时我们应该想服务器发送自己的名字 然后新开一个线程或者直接在主线程上跑 无限循环地读取服务器发来的消息 并将其打印在这个滚动文本框中 监听我们输入框的事件中 日期就用SimpleDateFormat来实现吧 当按下Enter或单击了发送按钮 我们就可以将输入的的信息发送给服务端并清空输入框

同样的 客户端也记得要做数据流关闭处理 和上方服务端差不多 但是还要多一个步骤 监听窗口关闭的事件 在关闭的时候关闭IO流

注意:这肯定不是最优办法 但是应该是适合新人的方法

一般的电脑是无法直接IP端口连接的 因为我们的要求是局域网 想要在广域网连接需要端口映射技术

在读取完发来的信息或发送完信息后不要将流关闭 就保持开着就行 不然的话整个连接都会被关闭...

本人第一次写回答 语言表达能力有限 文字很多东西都讲不清楚 挺含糊的 如果有不懂欢迎来问我哦

如果想要实现问题中的注册登录也只需要简单的发包和存储数据即可 密码如果不对直接返回密码错误的消息 然后把连接关闭就行啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的Java聊天室: 1. 服务端 服务端可以使用Java的Socket和ServerSocket类来实现。以下是一个简单的服务端代码: ```java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class Server { private final int PORT = 8080; private List<ClientHandler> clients = new ArrayList<>(); public void start() { try { // 创建一个ServerSocket,监听指定端口 ServerSocket serverSocket = new ServerSocket(PORT); System.out.println("Server started on port " + PORT); while (true) { // 等待客户端连接 Socket clientSocket = serverSocket.accept(); System.out.println("New client connected: " + clientSocket); // 创建一个新的ClientHandler,并将其加入到列表中 ClientHandler clientHandler = new ClientHandler(clientSocket, this); clients.add(clientHandler); // 开启一个新的线程来处理该客户端的请求 new Thread(clientHandler).start(); } } catch (IOException e) { e.printStackTrace(); } } public void broadcast(String message) { // 将消息广播给所有客户端 for (ClientHandler client : clients) { client.sendMessage(message); } } public void removeClient(ClientHandler client) { // 将指定客户端从列表中移除 clients.remove(client); } public static void main(String[] args) { new Server().start(); } } ``` 2. 客户端 客户端也可以使用Java的Socket类来实现。以下是一个简单的客户端代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class Client { private final String HOST = "localhost"; private final int PORT = 8080; private Socket socket; private BufferedReader in; private PrintWriter out; public void start() { try { // 创建一个Socket,连接到指定地址和端口 socket = new Socket(HOST, PORT); System.out.println("Connected to server on " + HOST + ":" + PORT); // 获取输入输出流 in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); // 开启一个新的线程来接收服务器发送的消息 new Thread(new ServerListener()).start(); // 从命令行读取用户输入,并将其发送给服务器 BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); while (true) { String input = console.readLine(); out.println(input); } } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } private class ServerListener implements Runnable { @Override public void run() { try { while (true) { String message = in.readLine(); System.out.println(message); } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { new Client().start(); } } ``` 3. 客户端处理器 客户端处理器负责处理客户端的请求并将其转发给其他客户端。以下是一个简单的客户端处理器代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class ClientHandler implements Runnable { private Socket clientSocket; private Server server; private BufferedReader in; private PrintWriter out; public ClientHandler(Socket clientSocket, Server server) { this.clientSocket = clientSocket; this.server = server; } @Override public void run() { try { // 获取输入输出流 in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); out = new PrintWriter(clientSocket.getOutputStream(), true); while (true) { String input = in.readLine(); if (input == null) { break; } // 将接收到的消息转发给其他客户端 server.broadcast(input); } } catch (IOException e) { e.printStackTrace(); } finally { try { // 关闭输入输出流和客户端Socket in.close(); out.close(); clientSocket.close(); // 将该客户端从服务器中移除 server.removeClient(this); } catch (IOException e) { e.printStackTrace(); } } } public void sendMessage(String message) { // 将消息发送给该客户端 out.println(message); } } ``` 以上就是一个简单的Java聊天室。当然,在实际开发中,你还需要考虑消息的编码和解码、用户认证和安全等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值