【问题标题】:Java - Keeping a socket client alive after finishing readingJava - 完成阅读后保持套接字客户端处于活动状态
【发布时间】:2014-06-01 20:54:45
【问题描述】:

我对 Java 中的套接字有点陌生,但这是我的问题:

我编写了一个客户端线程类,它将请求连接到由另一个应用程序创建的服务器(因此我没有为服务器类创建的类)。基本上,此应用程序将传输一定数量的字节并关闭套接字的服务器端。我已经完全能够接收和处理这些字节。

我的问题是可以告诉客户端套接字“等待”来自同一地址/端口的另一个连接可用,然后继续读取字节吗? (本质上,我运行应用程序,它读取字节并完成,然后我再次运行应用程序,客户端仍然可以读取)

这是我的客户端线程的代码:

public class ClientThread extends Thread{

    private Socket soc;
    private InputStream in;
    private String host;
    private int port;

public ClientThread(String host, int port)
{
    this.host = host;
    this.port = port;
    soc = null;
    in = null;
}

public boolean connectToServer()
{
    try {
        soc = new Socket(host, port);
        in = new BufferedInputStream(soc.getInputStream());
        System.err.println("Connection accepted: "+soc);
        return true;
    } catch (UnknownHostException e) {
        System.err.println("Unable to determine IP of host: "+host+".");
        return false;
    } catch (SocketException e) {
        System.err.println("Error creating or accessing the socket.");
        return false;
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection to: "+host+".");
        return false;
    }
}

public boolean disconnectFromServer()
{
    try {
        if(in != null)
            in.close();
        if(soc != null && soc.isConnected()) {
            soc.close();
            soc = null;
            System.err.println("Connection successfully closed!");
        }
        return true;
    } catch (Exception e) {
        System.err.println("Exception: "+e);
        return false;
    }
}

@Override
public void run() {
    try {
        int sz = 0;
        byte[] tmp = new byte[25];
        while(true)
        {
                if(sz == -1) {
                    sz = 0;
                }
                sz += in.read(tmp, sz, 25-sz);
                System.out.println(sz);
                if(sz == 25) {
                    tmp = new byte[25];
                    for(byte b: tmp)
                        System.out.print(b);
                    sz = 0;
                    Thread.sleep(500);
                }

        } 
    } catch (SocketException e) {
        System.err.println("Connection closed abruptly.");
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection to: "+host+".");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }       
}
}

【问题讨论】:

    标签: java sockets client


    【解决方案1】:

    accept() 返回时,服务器会收到一个套接字,只要该套接字没有关闭,连接就会保持打开状态。

    所以当你第一次运行应用程序,然后关闭服务器然后第二次运行它时,我认为连接会断开,你必须重新初始化它。

    isConnected() 方法会给你一个错误的结果,因为如果你没有在客户端明确关闭套接字,这将始终返回 true

    如果您想确定,您可以运行一次客户端-服务器连接,然后关闭服务器,重新启动它,然后尝试从/向服务器读取/写入。如果连接断开,您将获得 -1 作为读取结果和 IOException 写入结果。

    【讨论】:

    • 好的,是的,我相信当应用程序完成时,连接会关闭。如果有新的服务器端套接字可用,是否有一种有效的方法让客户端自动重新连接?
    • 也许您可以编写一个Thread,它会使用我在答案中描述的方法经常检查连接(只需进行读取或写入,我想读取将是最简单的方法)以及何时连接丢失,调用方法打开连接即可。
    • 这可能有效。但是我还有另一个问题,如果它不是太麻烦的话。假设我在应用程序传输其所有数据之前手动断开我的客户端。然后我想重新连接我的客户端以完成其余数据的读取。那可能吗?我打开了 TCPview,它说应用程序的套接字在我断开客户端后仍在侦听。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2020-11-30
    • 2018-04-13
    • 2021-05-02
    • 2016-06-05
    • 2012-07-08
    • 2011-10-19
    相关资源
    最近更新 更多