21xrx.com
2024-05-20 16:44:40 Monday
登录
文章检索 我的文章 写文章
Java多线程网络聊天室代码
2023-07-04 21:36:55 深夜i     --     --
Java 多线程 网络 聊天室 代码

Java多线程网络聊天室是一种基于网络技术的即时通讯应用程序。它能够实现用户之间的文字通信,并且能够提供群聊功能等。

Java多线程网络聊天室的实现需要使用Java的多线程、socket、GUI界面设计等多种技术。在此,我们将介绍一个简单的Java多线程网络聊天室代码示例:

1. 创建服务器端代码

首先,需要创建一个服务器端代码,通过设置服务器的IP地址和端口号来监听客户端的连接请求。以下是Java多线程网络聊天室的服务器端代码:


import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

public class Server {

  private ServerSocket serverSocket;

  private ArrayList<ClientHandler> clients;

  public void start(int port) {

    try {

      serverSocket = new ServerSocket(port);

      clients = new ArrayList<ClientHandler>();

      System.out.println("服务器已启动,等待客户端连接...");

      while (true) {

        Socket socket = serverSocket.accept();

        ClientHandler clientHandler = new ClientHandler(socket, this);

        clients.add(clientHandler);

        clientHandler.start();

      }

    } catch (IOException e) {

      e.printStackTrace();

    }

  }

  public void broadcast(String message, ClientHandler clientHandler) {

    for (ClientHandler client : clients) {

      if (client != clientHandler) {

        client.send(message);

      }

    }

    System.out.println("广播消息:" + message);

  }

  public void removeClient(ClientHandler clientHandler) {

    clients.remove(clientHandler);

    System.out.println("移除客户端:" + clientHandler.getName());

  }

  public static void main(String[] args) {

    Server server = new Server();

    server.start(8888);

  }

}

在上述代码中,我们定义了一个Server类,并创建了一个ServerSocket对象用于监听客户端的连接请求。在客户端接收请求时,将客户端的socket对象传入到ClientHandler对象中,然后启动一个新的线程来处理该客户端连接请求。我们还提供了广播消息和移除客户端的方法。

2. 创建客户端代码

接下来,需要编写客户端代码,用于连接到服务器并进行聊天。以下是Java多线程网络聊天室的客户端代码示例:


import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.Socket;

import java.util.Scanner;

public class Client {

  private Socket socket;

  private String name;

  private DataOutputStream dos;

  private DataInputStream dis;

  public void start(String ip, int port) {

    try {

      socket = new Socket(ip, port);

      dos = new DataOutputStream(socket.getOutputStream());

      dis = new DataInputStream(socket.getInputStream());

      Scanner scanner = new Scanner(System.in);

      System.out.print("请输入用户名:");

      name = scanner.nextLine();

      dos.writeUTF(name);

      System.out.println("连接成功,可以开始聊天");

      new Thread(() -> {

        try {

          while (true) {

            String message = dis.readUTF();

            System.out.println(message);

          }

        } catch (IOException e) {

          e.printStackTrace();

        }

      }).start();

      while (true) {

        String message = scanner.nextLine();

        dos.writeUTF("[" + name + "]说:" + message);

      }

    } catch (IOException e) {

      e.printStackTrace();

    }

  }

  public static void main(String[] args) {

    Client client = new Client();

    client.start("127.0.0.1", 8888);

  }

}

在上述代码中,我们创建了一个Client类,并使用socket对象连接到Server端。在连接成功后,通过输入用户名,便可以开始进行聊天。我们使用两个线程来实现接收和发送消息的操作。

3. 创建客户端处理类

为了能够同时支持多个客户端,我们需要使用多线程技术。在此,我们创建一个ClientHandler类,用于处理每个客户端的连接请求,并负责收发消息的操作。


import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.Socket;

public class ClientHandler extends Thread {

  private Socket socket;

  private String name;

  private DataInputStream dis;

  private DataOutputStream dos;

  private Server server;

  private boolean isRunning;

  public ClientHandler(Socket socket, Server server) {

    this.socket = socket;

    this.server = server;

    try {

      dis = new DataInputStream(socket.getInputStream());

      dos = new DataOutputStream(socket.getOutputStream());

    } catch (IOException e) {

      e.printStackTrace();

    }

  }

  @Override

  public void run() {

    try {

      name = dis.readUTF();

      System.out.println("新客户端接入:" + name);

      isRunning = true;

      while (isRunning) {

        String message = dis.readUTF();

        server.broadcast(message, this);

      }

    } catch (IOException e) {

      server.removeClient(this);

      isRunning = false;

    }

  }

  public void send(String message) {

    try {

      dos.writeUTF(message);

    } catch (IOException e) {

      e.printStackTrace();

    }

  }

  public String getName()

    return name;

  

}

在上述代码中,我们定义了一个ClientHandler类,继承自Thread类。在ClientHandler对象中,我们创建了一个socket对象来表示当前客户端的连接。在run()方法中,我们读取客户端的用户名,并通过广播的方式将该客户端连接信息发送给其他客户端。在接收到客户端发送的消息时,我们通过调用Server类中的broadcast方法来将消息发送给所有客户端。

通过这三个类的协同工作,我们便可以快速实现一个基于Java多线程的网络聊天室代码。这个网络聊天室代码可以满足基本的聊天需求,但是,对于实际应用场景,还需要做更加完善的功能和性能优化。

  
  

评论区

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