21xrx.com
2024-11-22 08:10:43 Friday
登录
文章检索 我的文章 写文章
Java编写一对一聊天室的完整代码
2023-06-17 10:40:34 深夜i     --     --
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();

    }

  }

}

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复