当前位置: 首页 > 知识库问答 >
问题:

如何停止同一连接的while循环的连续执行

濮阳翔
2023-03-14

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

while循环应该连接到新的客户端,但代码仍然重复连接到第一个客户端,甚至在它连接之后也是如此,从而导致绑定失败错误。我该换什么?

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();
        }
    }
}

共有2个答案

刘弘新
2023-03-14

Catch Exception是错误的实践

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

尝试将自定义异常(MyException.class)转发到顶层,并在Try..catch中的ServerM类中处理此异常。并且不要忘记在finally块中关闭socket

ss.close();
s.close();
陈实
2023-03-14

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

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

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]个客户端实例来处理每个连接。

 类似资料:
  • 问题是,如果不停止整个程序,我就不能退出虽然循环。 当我在Raspberry Pi上执行代码时,相机开始录制,但当我想结束视频并按Ctrl c时,整个程序停止,而不是在while循环后继续。我以为信号处理器会捕捉到键盘中断,但它没有。 我的代码: 我尝试的是: 错误:

  • 不知道如何阻止这个while循环无限重复。我使用检查用户输入是否为int。如果没有输入int值,则循环将无限重复。

  • 我想写一个程序,列出所有的。xml文件,然后将其复制到另一个目录并从原始目录中删除。程序的这一部分运行良好。我想这样做,我可以点击GUI中的一个按钮,让它扫描和处理文件夹,直到我按下一个按钮将其关闭。再说一次,打开它不是问题,但试图阻止它让我难堪。我想在两者之间等待一段时间,但要利用时间。sleep(x)冻结整个程序,在它停止Hibernate之前不允许我输入任何命令,只允许它处理然后再次Hibe

  • 问题内容: 好的,我在一个空程序上进行了测试,仅运行一会儿(true){}就使我的CPU占用了50%以上的资源。我正在开发一个游戏,它使用while循环作为主循环,并且CPU始终处于100。 我如何才能让Java重复执行某些操作,而又不消耗超过50%的CPU来执行重复操作呢? 问题答案: 添加睡眠以使线程在一段时间内处于空闲状态: 没有睡眠,while循环将消耗所有可用的计算资源。(例如,理论上,

  • 问题内容: 我正在编写代码以确定nxn列表中的每个元素是否相同。即返回true,但将返回false。我正在考虑编写一个代码,当它发现与第一个元素不同的元素时立即停止。即: 我想停止此循环, 然后返回false。否则返回true。我将如何实施呢? 问题答案: 使用和为此。可以使用以下命令在Python中完成打破嵌套循环的操作: 另一种方法是将所有内容包装在函数中,并用于从循环中退出。

  • 问题内容: 我试图用图像精灵建立一个加载指示器,然后我想到了这个功能 所以输出看起来像这样 我不得不使用setBgPosition(); 在其他内部保持循环运行,所以现在我的问题是一旦我想要[加载完成],如何停止该循环? 问题答案: 返回计时器句柄,您可以使用该句柄停止超时。 因此,例如: 因此,您可以将其用作: 请注意,我没有将其再次调用,而是将其重新设置为。否则,这将行不通。另请注意,我已将超