Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重用套接字的inputstream_Java_Sockets_Tcp - Fatal编程技术网

Java 重用套接字的inputstream

Java 重用套接字的inputstream,java,sockets,tcp,Java,Sockets,Tcp,我想知道如何保持套接字的输入流,并在应用程序关闭之前重用它。 我现在要做的是在main方法中创建一个线程。该线程应该在应用程序运行的所有时间内保持运行。在这个线程中,我使用套接字输入流从服务器读取数据。但我只能读取服务器发送的内容一次。之后,我认为线程已经死了,或者我无法从输入流中读取数据。如何保持输入流读取来自服务器的内容。 谢谢 我把所有的东西都放在这里,但在我的代码中,事情是以不同的方式发生的 readInt方法: public static int readInt(InputStream

我想知道如何保持套接字的输入流,并在应用程序关闭之前重用它。 我现在要做的是在main方法中创建一个线程。该线程应该在应用程序运行的所有时间内保持运行。在这个线程中,我使用套接字输入流从服务器读取数据。但我只能读取服务器发送的内容一次。之后,我认为线程已经死了,或者我无法从输入流中读取数据。如何保持输入流读取来自服务器的内容。 谢谢

我把所有的东西都放在这里,但在我的代码中,事情是以不同的方式发生的

readInt方法:

public static int readInt(InputStream in) throws IOException {
    int byte1 = in.read();
    int byte2 = in.read();
    int byte3 = in.read();
    int byte4 = in.read();
    if (byte4 == -1) {
        throw new EOFException();
    }
    return (byte4 << 24)
            + ((byte3 << 24) >>> 8)
            + ((byte2 << 24) >>> 16)
            + ((byte1 << 24) >>> 24);
}
publicstaticintreadint(InputStream-in)抛出IOException{
int字节1=in.read();
int字节2=in.read();
int字节3=in.read();
int字节4=in.read();
如果(字节4==-1){
抛出新的EOFEException();
}
返回(字节4>8)
+((字节2>>16)
+((字节1>>24);
}

用于little endian转换。

您的套接字可能会阻塞。如果遇到此类问题,一个好办法是为轮询方法而不是中断驱动设计软件。然后,软件设计模式将围绕您试图实现的目标进行


希望有帮助!干杯!

您需要在如下循环中调用input.read()

try {
    while(running) {
        int length = readInt(input);
        byte[] msg = new byte[length];
        input.read(msg);
        ByteArrayInputStream bs = new ByteArrayInputStream(msg);
            DataInputStream in = new DataInputStream(bs);
            int cmd = readInt(in);
        switch(cmd) {
            case 1: Msg msg = readMsg(cmd, msg);
        }

     }
} catch (IOException e) { 
    //Handle error
}

完成线程需要执行的操作后,将running设置为false。请记住,input.read()将阻塞,直到套接字接收到某些内容。我希望这会有所帮助。

向我们展示一些代码。听起来好像没有什么可从套接字读取的内容,所以
read()
正在阻塞(等待有数据可读取)。我建议粘贴一些打印语句,让您知道发生了什么,或者在一个好的调试器下运行它,这样您就可以看到正在运行的内容以及何时停止运行。如果没有代码或实际了解问题所在,我们不太可能为您提供很大帮助。另外:您使用的是什么协议?您确定客户端和服务器也没有关闭套接字(或其流)?我正在netbeans探查器中运行应用程序,我看到我运行读取服务器发送内容的代码的线程已完成…线程在我从服务器读取内容时已完成。为什么它完成了?它是否超出了您的读取()循环是出于某种原因吗?但我不知道为什么它会结束,它似乎没有例外。这是我的运行方法:public void run(){try{handleReadServer(in);}catch(Exception ex){Logger.getLogger(Clazz.class.getName()).log(Level.SEVERE,null,ex);},如果抛出了一些异常,我会看到它,但我什么也看不到例行公事?也许你可以更新你的帖子并粘贴你的代码,让我们结账。干杯!你的代码在最后一次读的时候被阻塞了。参考:如果你想,你可以考虑发送你自己的字符分隔符,因为流的结尾会根据规范返回你1。
try {
    while(running) {
        int length = readInt(input);
        byte[] msg = new byte[length];
        input.read(msg);
        ByteArrayInputStream bs = new ByteArrayInputStream(msg);
            DataInputStream in = new DataInputStream(bs);
            int cmd = readInt(in);
        switch(cmd) {
            case 1: Msg msg = readMsg(cmd, msg);
        }

     }
} catch (IOException e) { 
    //Handle error
}