21xrx.com
2025-04-22 21:31:46 Tuesday
文章检索 我的文章 写文章
Java编写一对一聊天室的完整代码
2023-06-17 10:40:34 深夜i     17     0
Java Socket编程 一对一聊天室代码

随着互联网的发展,各种聊天工具层出不穷,而其中一对一聊天是相当常见的一种形式。在Java中,我们可以通过Socket编程实现一对一聊天室。

首先,我们需要创建两个Client端,分别表示两个用户。然后,建立一个Server端用于接受两个Client端传来的消息并转发给对方。

在实现聊天室的时候,我们需要实现以下几个重要的步骤:建立Socket连接、获取输入输出流、循环读写数据、关闭流和Socket连接。

其中,建立Socket连接时,我们需要指定Server端的IP地址和端口号,并设置Client端的用户名。

获取输入输出流时,我们可以使用BufferedReader和PrintWriter来实现数据的读写。然后,通过while循环不断读取客户端发送的消息,并将其转发给对方。

在关闭流和Socket连接时,我们需要在finally块中完成相关的操作,以保证资源的正确释放。

通过以上的步骤,我们可以轻松地实现一对一聊天室的功能。下面是完整的Java代码:

// Client端代码
import java.io.*;
import java.net.*;
public class Client {
  public static void main(String[] args) {
    try {
      Socket socket = new Socket("localhost", 6666);
      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      PrintWriter out = new PrintWriter(socket.getOutputStream());
      System.out.println("请输入用户名:");
      String userName = reader.readLine();
      out.println(userName);
      out.flush();
      new Thread(new ReceiveMessage(in)).start();
      String message;
      while ((message = reader.readLine()) != null && !message.equals("exit")) {
        out.println(message);
        out.flush();
      }
      socket.shutdownOutput();
      socket.shutdownInput();
      socket.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
class ReceiveMessage implements Runnable {
  BufferedReader in;
  ReceiveMessage(BufferedReader in)
    this.in = in;
  
  public void run() {
    try {
      String message;
      while ((message = in.readLine()) != null) {
        System.out.println(message);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
// Server端代码
import java.io.*;
import java.net.*;
import java.util.*;
public class Server {
  public static void main(String[] args) {
    try {
      ServerSocket serverSocket = new ServerSocket(6666);
      while (true) {
        Socket socket = serverSocket.accept();
        new Thread(new ServerThread(socket)).start();
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
class ServerThread implements Runnable {
  Socket socket;
  BufferedReader in;
  PrintWriter out;
  String userName;
  static Map
  onlineUsers = new HashMap<>();
 
  ServerThread(Socket socket) throws IOException {
    this.socket = socket;
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    out = new PrintWriter(socket.getOutputStream());
    userName = in.readLine();
    onlineUsers.put(userName, this);
    System.out.println(userName + "上线了");
    sendMessageToAll(userName + "上线了\n");
  }
  public void run() {
    try {
      String message;
      while ((message = in.readLine()) != null && !message.equals("exit")) {
        sendMessageToAll(userName + "说:" + message + "\n");
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        onlineUsers.remove(userName);
        System.out.println(userName + "下线了");
        sendMessageToAll(userName + "下线了\n");
        if (socket != null) {
          socket.shutdownInput();
          socket.shutdownOutput();
          socket.close();
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  public void sendMessageToAll(String message) {
    for (ServerThread st : onlineUsers.values()) {
      st.out.println(message);
      st.out.flush();
    }
  }
}

  
  

评论区

请求出错了