重用套接字的输入流

时间:2011-06-14 14:24:27

标签: java sockets tcp

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

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

我把所有东西放在这里,但在我的代码中,事情发生在不同的方法中。

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

用于小端转换。

2 个答案:

答案 0 :(得分:1)

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

希望它有所帮助!干杯!

答案 1 :(得分:0)

你需要在这样的循环中调用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
}

当您完成线程需要执行的操作时,将运行设置为false。记住input.read()将阻塞,直到套接字收到了什么。我希望这会有所帮助。