Java 等待来自服务器的数据时将套接字连接置于休眠状态

Java 等待来自服务器的数据时将套接字连接置于休眠状态,java,multithreading,sockets,interrupt,Java,Multithreading,Sockets,Interrupt,我有一个连接到服务器套接字的客户端套接字,服务器在连接时会不时向客户端发送数据。目前,我的客户机使用while循环来保持从服务器接收数据,即使服务器没有发送任何内容 我的问题是,有没有更有效的方法来听取意见 我在想,也许可以为套接字连接创建一个线程,在没有传入数据时将其置于睡眠状态,并在有数据传入时发送一个中断。这样行吗?如果将线程置于睡眠状态,是否会中断套接字连接 我无法修改服务器套接字,它不会启动连接 import java.io.*; import java.net.Socket; pu

我有一个连接到服务器套接字的客户端套接字,服务器在连接时会不时向客户端发送数据。目前,我的客户机使用while循环来保持从服务器接收数据,即使服务器没有发送任何内容

我的问题是,有没有更有效的方法来听取意见

我在想,也许可以为套接字连接创建一个线程,在没有传入数据时将其置于睡眠状态,并在有数据传入时发送一个中断。这样行吗?如果将线程置于睡眠状态,是否会中断套接字连接

我无法修改服务器套接字,它不会启动连接

import java.io.*;
import java.net.Socket;

public class core_socket {
    public static void main(String[] args) {
        String host = ("192.168.100.206");
        int port = 4025;
        try {
            Socket socket = new Socket(host, port);

            System.out.println("created socket\n");
            OutputStream os = socket.getOutputStream();
            boolean autoflush = true;
            PrintWriter out = new PrintWriter(socket.getOutputStream(), autoflush);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            // read the response
            boolean loop = true;
            StringBuilder sb = new StringBuilder(8096);
            while (loop) {
                if (in.ready()) {
                    int i = 0;
                    while (i != -1) {
                        i = in.read();
                        sb.append((char) i);
                    }
                    loop = false;
                }
            }

            // display the response to the out console
            System.out.println(sb.toString());

            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

也许您想要的是使用异步套接字。基本上,它派生出另一个线程,其任务是侦听套接字上的任何数据。一旦数据进入,就会调用一个“回调”方法,然后该方法就可以开始处理您的数据


我以前从未用java做过套接字,只是C语言,所以我不确定它是如何比较的,但是这个概念应该保持不变。

见多用户聊天应用程序示例——基本上,你应该考虑为每个传入的连接生成一个新的工作线程,然后返回到听任何新的传入请求。


很久以前,我写了第一批应用服务器之一(比如1997年,当时大多数人都不知道什么是应用服务器)——它部署在最大的高等教育院校之一,在高峰期每天处理数百万个请求——顺便说一句,这不是链接中的院校。我提到这一点的原因是。。。多线程只需很少的努力就可以提供巨大的可伸缩性-即使可伸缩性不是您想要的,工作线程模型仍然是一种很好的做法。

多线程不提供可伸缩性,因为上下文切换需要很多时间。实际上,多线程模式是最糟糕的,请看以下内容:@nouney感谢您共享此链接。我希望我手头有足够的时间来通读和理解它。现在,我真的想利用我所知道的帮助——如果这不是正确的解决方案,我相信其他人也会有。另外,我不认为最初的提问者需要任何级别的高可扩展性,因为复杂的实现比在这样的论坛中解决的问题要困难得多。@nouney和smallworld,感谢您提供的链接,它们非常棒,我会阅读更多内容,如果遇到任何问题,我会发回问题。