java Socket服务端

本文介绍了一个简单的聊天服务器的实现过程,使用Java语言创建了一个多线程服务器,该服务器能够接收客户端连接并处理多个用户之间的聊天消息。服务器通过ExecutorService管理线程池来处理客户端请求,并利用Socket通信进行消息传递。
  1. public class ChatServer {
  2. private static final int PORT = 8888; // 端口号
  3. private static List<Socket> list = new ArrayList<Socket>(); // 保存连接对象
  4. private ExecutorService exec;
  5. private ServerSocket server;

  6. public static void main(String[] args) {
  7. new ChatServer();
  8. }

  9. public ChatServer() {
  10. try {
  11. server = new ServerSocket(PORT);
  12. exec = Executors.newCachedThreadPool();
  13. System.out.println("服务器已启动!");

  14. Socket client = null;
  15. while (true) {
  16. client = server.accept(); // 接收客户连接
  17. list.add(client);
  18. exec.execute(new ChatTask(client));
  19. }
  20. } catch (IOException e) {
  21. e.printStackTrace();
  22. }
  23. }

  24. static class ChatTask implements Runnable {
  25. private Socket socket;
  26. private BufferedReader br;
  27. private PrintWriter pw;
  28. private String msg;

  29. public ChatTask(Socket socket) throws IOException {
  30. this.socket = socket;
  31. br = new BufferedReader(new InputStreamReader(socket
  32. .getInputStream()));
  33. msg = "【" + this.socket.getInetAddress() + "】进入聊天室!当前聊天室有【"
  34. + list.size() + "】人";

  35. sendMessage();
  36. }

  37. public void run() {
  38. try {
  39. while ((msg = br.readLine()) != null) {
  40. if (msg.trim().equals("bye")) {
  41. list.remove(socket);
  42. br.close();
  43. pw.close();
  44. msg = "【" + socket.getInetAddress() + "】离开聊天室!当前聊天室有【"
  45. + list.size() + "】人";
  46. socket.close();

  47. sendMessage();
  48. break;
  49. } else {
  50. msg = "【" + socket.getInetAddress() + "】说:" + msg;
  51. sendMessage();
  52. }
  53. }
  54. } catch (IOException e) {
  55. e.printStackTrace();
  56. }
  57. }

  58. /**
  59. * 群发消息给聊天室的所有人
  60. */
  61. private void sendMessage() throws IOException {
  62. System.out.println(msg);
  63. for (Socket client : list) {
  64. pw = new PrintWriter(client.getOutputStream(), true);
  65. pw.println(msg);
  66. }
  67. }
  68. }
  69. }
### Java Socket 服务端实现示例 以下是一个完整的 Java Socket 服务端实现示例,基于提供的引用内容以及相关知识进行扩展和说明。 #### 示例代码 ```java import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class SimpleServer { public static void main(String[] args) { int port = 6666; // 设置监听端口 try (ServerSocket serverSocket = new ServerSocket(port)) { // 创建服务端Socket System.out.println("Server started and listening on port " + port); while (true) { // 循环等待客户端连接请求 Socket socket = serverSocket.accept(); // 接受客户端连接 System.out.println("Client connected: " + socket.getInetAddress().getHostAddress()); // 创建输入流读取客户端发送的数据 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String clientMessage = in.readLine(); System.out.println("Received from client: " + clientMessage); // 创建输出流向客户端发送响应数据 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println("Hello, Client!"); // 发送响应信息给客户端 // 关闭资源 in.close(); out.close(); socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } ``` #### 实现说明 1. **服务端启动**:通过 `ServerSocket` 类指定监听端口[^2],例如 `new ServerSocket(6666)`。 2. **等待客户端连接**:使用 `serverSocket.accept()` 方法阻塞等待客户端连接请求[^4]。 3. **处理客户端连接**:当客户端连接成功后,创建输入流和输出流分别用于读取客户端消息和向客户端发送响应消息[^3]。 4. **关闭资源**:在每次通信结束后,确保关闭所有打开的流和 Socket 连接,避免资源泄漏[^1]。 #### 注意事项 - 端口号必须大于 1024 且未被其他程序占用[^3]。 - 如果需要支持多个客户端同时连接,可以将每个客户端的连接处理逻辑放入独立线程中执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值