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

使用带有套接字的循环时,Java进入另一个线程

东方英豪
2023-03-14

我需要一个帮助,我正在试图使客户服务器应用程序复制文件在Java...我有一个MainWnd对象,它创建了TCPServer对象,在send按钮上,它将创建TCPClient对象,它将初始数据发送给对手TCPServer并将打开给定数量的侦听线程(让它是n个)(这个侦听线程在这里只是因为它们接受一个文件)(每个线程在不同的端口上侦听发送回TCPClient)TCPClient然后创建n个其他TCPClients线程发送文件...这是我的,它正在运行。问题是,当接收方点击“中断”按钮时,文件接收会被中断。我无法获得对接收者的TCPServer线程的这种中断的信息,这应该会杀死正在下载文件的这n个线程。

我想问题出在TCPServer上,那里是infinit循环,但是这个套接字会造成循环阻塞,所以我不能进入Connection类,杀死这n个线程。

TCP服务器

public void setSendInterruption() {
    this.interruptedSending = true;
    //c.setSendInterruption();
}

public TCPServer(int port, int socketNums, Map<Byte, LinkedList<Byte>> realData, File file, int fileLength) {
    this.serverPort = port;
    this.socketNums = socketNums;
    if(file != null)
        this.file = file;
    if(fileLength != -1)
        this.fileLength = fileLength;
    if(realData != null)
        this.realData = realData;

    if(tmpData != null)
        this.tmpData = tmpData;
}

@Override
public void run() {
    try { 
        System.out.println(this.getId());
        listenSocket = new ServerSocket(serverPort); 

        System.out.println("server start listening... ... ...");

        while(true) {
            if(interruptedSending)
                System.out.println("Here I never come");
            Socket clientSocket = listenSocket.accept(); 
            Connection c = new Connection(clientSocket, socketNums, realData, file, fileLength); 
        } 
} 
catch(IOException e) {
        System.out.println("Listen :"+e.getMessage());} 
}

连接

while (true)
                {
                    byteRead = input.read();
                    //Thread.sleep(100);
                    if(interruptedSending) {
                        TCPClient tcpClient = new TCPClient(clientSocket.getPort(), clientSocket.getInetAddress().getHostAddress());
                        tcpClient.sendInterruptedData();
                        interruptedSending = false;
                    }
                    char lowChar;

                    if(byteRead == -1) {
                        break;
                    } else
                        lowChar = (char)byteRead;

                    lowData += lowChar;

                    if(lowData.length() >= 2) {
                        if (lowData.substring(lowData.length()-2).compareTo("//") == 0) {
                            break;
                        } else if (lowData.length() > 6) {
                            byteData.add((byte)byteRead);
                        }
                    }
                }

在连接方面,有更多的行,但它们只是主要解析一个协议。谢谢你的帮助。我希望我写得干净...

共有1个答案

谷隐水
2023-03-14

据我所知,每个连接都有一个运行它的线程。您想要中断这些线程中的每一个线程,但无法从线程内部执行,因为线程被困在input.read()中。

如果这是你的意思,就这么做:

在Connection的构造函数中保存线程,以便以后可以访问它。制作一个killThread()-方法或therelike,这样您就可以从外部访问线程:

public void killThread() {
    thread.interrupt(); //thread is the thread you saved in the constructor
}

当您想要终止连接线程时,调用killThread()。这将导致线程抛出一个java.lang.InterruptedException,无论此时它在哪里。您可以忽略这一个(因为您希望线程无论如何都死掉),也可以使用

try {
    //your loop
} catch (InterruptedException e) {
    return;
}

这将很好地结束线程而不会抛出异常。

 类似资料:
  • 对Java来说很新鲜,我在大学的一个入门班做一个项目。我正在尝试做一个方法,在String数组中搜索输入的状态并返回索引。如果用户输入不在数组中的查询,我希望它要求一个新的状态来搜索。我的例外是说“变量statePotion可能尚未初始化。”下面是代码。 提前谢谢!

  • 我试图运行一个docker mysql容器与初始化db根据此消息中提供的指令https://stackoverflow.com/a/29150538/6086816.第一次运行后工作正常,但在第二次运行,尝试执行脚本 /usr/sbin/mysqld后,我得到这个错误: db_1|2016-03-19T14:50:14.819377Z 0[ERROR]pid 10的另一个进程是使用unix套接字文

  • 我在汇编语言中遇到了循环问题。 当我们想要使用计数器寄存器在嵌套循环中循环时,我们首先要做的是将计数器寄存器的值移动到外部循环的堆栈中,然后在我们完成内部循环时取回它,这样我们就能够使用一个计数器寄存器在每个循环中循环不同的迭代次数。 但是嵌套循环中的嵌套循环呢? 我想打印一个由字符< code>S组成的金字塔。我得到的是, 我真正想要的是, 这是我的程序代码 为了实现我想要的,我需要在嵌套循环中

  • 转换是否正确,或者是否有更好的方法将嵌套循环转换为流计算? 为什么流变体比旧变体慢得多? 为什么parallel()语句实际上将时间从0.19s增加到0.25s? 我知道微基准是脆弱的,并行性只有在遇到大问题时才值得,但对于CPU来说,即使是0.1秒也是永恒的,对吗? 更新 null

  • 我写了一个简单的udp服务器客户端应用程序与多播套接字。服务器每6毫秒向三个客户端发送数据包。数据包大小为1200字节。这是每秒166,66个数据包。每当其中一个客户端检测到丢失的数据包时,它将通过单播向服务器发送NACK数据包。 第一个测试:服务器和三个客户端通过以太网连接到路由器TP链路TL-WDR4300(dd wrt),一切正常。 第二次测试:只有服务器通过以太网连接到路由器,其他客户端通

  • 我有以下python生成器: 而且我想在Java中实现一个迭代器,它的行为有点像以前的生成器。我试图使用两个内部迭代器,但它不起作用。想法?