gpt4 book ai didi

java - 如何停止具有相同连接的 while 循环的连续执行

转载 作者:太空宇宙 更新时间:2023-11-04 09:44:38 26 4
gpt4 key购买 nike

我正在用 Java 为聊天应用程序创建一个服务器。

while 循环应该连接到新客户端,但代码即使在连接后仍会重复连接到第一个客户端,从而导致“绑定(bind)失败”错误。我应该改变什么?

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class ServerM
{
public static void main(String args[])
{
while(true)
{
Listener l = new Listener();
l.run();
}
}

}

class Listener implements Runnable
{
static InetAddress arr[] = new InetAddress[10];
static int i = 0;

public void run()
{

try
{
ServerSocket ss = new ServerSocket(44444);
System.out.println("Waiting...");
Socket s = ss.accept();
System.out.println("Connected!\n");

DataInputStream din=new DataInputStream(s.getInputStream());
String ip = din.readUTF();

InetAddress addr = InetAddress.getByName(ip);

for(int j=0; j<=i; j++)
{
if(arr[j] == addr)
return;
}

arr[i++] = addr;

ChatThread c = new ChatThread(addr,s);//This creates a thread to allow communication with Client
c.run();

}
catch(Exception e)
{
e.printStackTrace();
}
}
}

最佳答案

您的问题在于解决方案的设计。您正在运行服务器套接字的多个实例(并使用相同的端口,这将导致异常)并使用此线程来获取客户端连接,因此您只能有一个连接。

您应该做的是,为服务器套接字运行一个线程,该线程将监听所有连接,然后在无限循环中运行每个客户端实例(新线程)。

public class ServerM
{
public static void main(String args[])
{

Listener l = new Listener();
l.run();

}

}

class Listener implements Runnable
{
static InetAddress arr[] = new InetAddress[10];
static int i = 0;

public void run()
{

try
{
ServerSocket ss = new ServerSocket(44444);
System.out.println("Waiting...");
while (true) {
Socket s = ss.accept();
ClientListener clientListener = new ClientListener(s);
clientListener.run();
}

}
catch(Exception e)
{
e.printStackTrace();
}
}
}

class ClientListener implements Runnable {

private Socket socket;

public ClientListener(Socket socket) {
this.socket = socket;
}

public void run() {
System.out.println("Connected!\n");

DataInputStream din=new DataInputStream(s.getInputStream());
String ip = din.readUTF();

InetAddress addr = InetAddress.getByName(ip);

for(int j=0; j<=i; j++)
{
if(arr[j] == addr)
return;
}

arr[i++] = addr;

ChatThread c = new ChatThread(addr,socket);
c.run();
}

}

您必须这样做,因为您只需要一个 ServerSocket 实例来监听特定端口上的新连接,然后您需要 [1..n] 个客户端实例来处理每个连接。

关于java - 如何停止具有相同连接的 while 循环的连续执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55570420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com