gpt4 book ai didi

java - 如何从服务器向列表中的多个客户端发送消息

转载 作者:行者123 更新时间:2023-11-30 02:49:11 25 4
gpt4 key购买 nike

我尝试使用以下代码作为服务器向 IP 在列表 mSession 中的客户端发送消息

for (MSession mSession : mSessions)
{
System.out.println("Inside for each");
System.out.println("IP TEST : " + mSession.getRemote_Addr());
ServerSocket srvr = new ServerSocket(1324, 5, InetAddress.getByName(mSession.getRemote_Addr()));
Socket skt = srvr.accept();
System.out.println("IP1:" + InetAddress.getByName(mSession.getRemote_Host()));
System.out.println("IP2:" + skt.getInetAddress().getHostAddress());
System.out.print("Server has connected!\n");
PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
System.out.print("Sending string: '" + data + "'\n");
out.print(data);
out.close();
skt.close();
srvr.close();
}

客户端代码:

InetAddress ip = InetAddress.getByName(host[0]);
System.out.println("IP SERVER : " + ip);
Socket skt = new Socket(ip, 1324);// Ip address of server
in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
System.out.print("Received string: ");

while (!in.ready()) {}
data = in.readLine();
System.out.println(in.readLine());

System.out.print("'\n");
Popupapp app = new Popupapp();
app.fdis(data);
in.close();
skt.close();

我收到 bindexception 无法分配请求的地址:JVM_Bind我尝试过其他端口,但异常仍然相同我尝试过端口 8080、8089、8086、8009、1234、8242、8006

请帮我解决这个问题。

我尝试过这个简单的程序,它显示了相同的异常

public class ServerSide extends Thread{

public void run()
{
while(true)
{
String data = "Recieved new notification";
try {

ServerSocket srvr = new ServerSocket(1234, 5, InetAddress.getByName("192.168.168.40"));
Socket skt = srvr.accept();

skt.getInputStream();

System.out.print("Server has connected!\n");
PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
System.out.print("Sending string: '" + data + "'\n");
out.print(data);
out.close();
skt.close();
srvr.close();
Thread.sleep(500);



}

catch(Exception e) {
System.out.print("Whoops! It didn't work!\n" + e);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

}
}

最佳答案

原因是您在 foreach 循环内创建服务器套接字。因此,在第一次之后,当第一个客户端被处理并且第一次创建serversocket时,此代码在下一次客户端处理中再次尝试在同一端口上创建另一个serversocket,从而导致绑定(bind)异常。

解决方案是在循环之前创建一个单独的服务器套接字,它将继续在 foreach 循环内接受客户端。如下图所示:

ServerSocket srvr = new ServerSocket(1324, 5, InetAddress.getByName(mSession.getRemote_Addr()));
for (MSession mSession : mSessions)
{
System.out.println("Inside for each");
System.out.println("IP TEST : " + mSession.getRemote_Addr());
// start accepting client-requests
Socket skt = srvr.accept();
System.out.println("IP1:" + InetAddress.getByName(mSession.getRemote_Host()));
System.out.println("IP2:" + skt.getInetAddress().getHostAddress());
System.out.print("Server has connected!\n");
PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
System.out.print("Sending string: '" + data + "'\n");
out.print(data);
out.close();
skt.close();
}
// finally close the server-socket!
srvr.close();
<小时/>

根据您的编辑:

您再次在循环内创建 ServerSocket! 不要!!!* 在构造函数(或其他方法)中执行此操作。

public class ServerSide extends Thread{

public ServerSide(){
ServerSocket srvr = new ServerSocket(1234, 5, InetAddress.getByName("192.168.168.40"));
}
public void run()
{
while(true)
{
String data = "Recieved new notification";
try {
Socket skt = srvr.accept();
skt.getInputStream();
System.out.print("Server has connected!\n");
PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
System.out.print("Sending string: '" + data + "'\n");
out.print(data);
out.close();
skt.close();
srvr.close();
Thread.sleep(500);
}
catch(Exception e) {
System.out.print("Whoops! It didn't work!\n" + e);
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}

现在,从服务器端的主方法调用它,如下所示:

new ServerSide().start();

关于java - 如何从服务器向列表中的多个客户端发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39241115/

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