You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java多播客户端-服务器聊天仅支持单客户端连接问题求助

多客户端单服务器聊天程序连接问题及解决方法

问题描述

我是Java网络编程领域的新手,正在尝试实现一个多客户端单服务器的聊天程序,但发现同一时间仅能有一个客户端连接到服务器,连接第二个客户端时会抛出java.net.BindException错误。

相关代码

MainClient

package Multicast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class MainClient {

    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 5000)){
            BufferedReader input = new BufferedReader(new java.io.InputStreamReader(socket.getInputStream())); 
            PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
            Scanner scanner = new Scanner(System.in); 
            
            String userInput;
            String reponse;
            String clientName = "none";
            
            ClientThread clientThread = new ClientThread(socket);
            clientThread.start();
            
            do {
                if(clientName.equals("none")) {
                    System.out.println("please enter your name");
                    userInput = scanner.nextLine();
                    clientName = userInput;
                    output.println(userInput);
                }
                else {
                    String message = ("|"+clientName +"| :");
                    //System.out.println(message);
                    userInput = scanner.nextLine();
                    output.println(message + " " + userInput);
                    
                    if (userInput.equals("exit")) {
                        break;
                    }
                }
            }while (!userInput.equals("exit"));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

ClientThread

package Multicast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ClientThread extends Thread{
    
    private Socket socket;
    private BufferedReader input;
    
    public ClientThread(Socket s) throws IOException {
        this.socket = s;
        this.input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        
    }
    
    @Override
    public void run() {
        try {
            while(true) {
                String reponse = input.readLine();
                System.out.println(reponse);
            }
        }
        catch(IOException e){
            e.printStackTrace();
        }
        finally {
            try {
                input.close();
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

原MainServer代码

package Multicast;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class MainServeur {
    public static void main(String[] args) {
        ArrayList<ServerThread> threadList = new ArrayList<>();
        try(ServerSocket serverSocket = new ServerSocket(5000)){
            Socket socket = serverSocket.accept();
            ServerThread serverThread= new ServerThread(socket, threadList);
            threadList.add(serverThread);
            serverThread.start();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

ServerThread

package Multicast;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;

public class ServerThread extends Thread{
    private Socket socket;
    private ArrayList<ServerThread> threadList;
    private PrintWriter output;
    
    public ServerThread(Socket socket, ArrayList<ServerThread> threads) {
        this.socket = socket;
        this.threadList = threads;
        
    }
    
    @Override
    public void run() {
        try {
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            output = new PrintWriter(socket.getOutputStream(), true);
            
            while(true) {
                String outputString = input.readLine();
                if(outputString.equals("exit")) {
                    break;
                }
                printToAllClients(outputString);
                System.out.println("Server received : " + outputString);
                
            }
        }
        catch(Exception e) {
            System.out.println("error occured in main of server : "+ e.getStackTrace());
        }
    }
    
    private void printToAllClients(String outputString) {
        for(ServerThread sT : threadList) {
            sT.output.println(outputString);
        }
    }

}

错误信息

java.net.BindException: Cannot assign requested address: connect
    at java.base/sun.nio.ch.Net.connect0(Native Method)
    at java.base/sun.nio.ch.Net.connect(Net.java:579)
    at java.base/sun.nio.ch.Net.connect(Net.java:568)
    at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
    at java.base/java.net.Socket.connect(Socket.java:633)
    at java.base/java.net.Socket.connect(Socket.java:583)
    at java.base/java.net.Socket.<init>(Socket.java:507)
    at java.base/java.net.Socket.<init>(Socket.java:287)
    at Multicast.MainClient.main(MainClient.java:13)

参考说明

参考了某教程。

问题解决:修改后的MainServer代码

问题已解决,修改后的MainServer代码如下:

package Multicast;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class MainServeur {
    public static void main(String[] args) {
        ArrayList<ServerThread> MyThread = new ArrayList<>();
        try (ServerSocket serverSocket = new ServerSocket(5000)) {
            for (;;) {
                Socket socket = serverSocket.accept();
                ServerThread s = new ServerThread(socket, MyThread);
                MyThread.add(s);
                s.start();
            }
        } catch (IOException e) {
            e.printStackTrace();;
        }
    }
}

内容的提问来源于stack exchange,提问作者Armand Marcelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:25:35