Java Socket 不返回流中的任何内容

标签 java sockets

当我尝试从套接字(位于本地主机)获取信息时,它永远不会用 php 返回我想要的信息(来 self 的服务器的信息),它工作正常..

Java 应用程序: 运行调试 不返回任何内容
Glassfish 服务器: 运行不返回任何内容,调试每次调试时都会返回所有信息

PHP 代码:

$Socket = fsockopen($this->Host, $this->Port, $errno, $errstr, 5);
    if(!$Socket) {
    return false;
} else {

    stream_set_timeout($Socket, 1);
    stream_set_blocking($Socket, false);

    fwrite($Socket, chr(6).chr(0).chr(255).chr(255).'info');
    while(!feof($Socket)) {
        $this->SocketData .= fgets($Socket, 8192);
    }
    fclose($Socket);
    return true;
}


Java代码:

public static String serverInfo(String ip, Integer port) {
    try (Socket socket = new Socket(ip, port)) {
        //System.out.println("Connected to " + socket.getInetAddress() + " on port " + socket.getPort() + " from port " + socket.getLocalPort() + " of " + socket.getLocalAddress());

        OutputStream os = socket.getOutputStream();
        String info = ((char) 6 + "" + (char) 0 + "" + (char) 255 + "" + (char) 255 + "info");
        System.out.println(info);
        os.write(info.getBytes());

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        StringBuilder stb = new StringBuilder();
        while (br.ready()) {
            stb.append(br.readLine());
        }
        if (!stb.toString().isEmpty()) {
            //System.out.println("Info: " + stb.toString());
            return stb.toString();
        } else {
            //System.out.println("No answer from server.");
            return null;
        }
    } catch (UnknownHostException e) {
        System.err.println("I can't find " + ip);
    } catch (SocketException e) {
        System.err.println("Could not connect to " + ip);
    } catch (IOException e) {
        System.err.println(e);
    }
    return null;
}


我正在寻找的是做与 php 相同的事情,连接到套接字,获取信息并返回/保存/使用该信息,我不知道会发生什么,只有我尝试的 1/100 次,它返回一些东西。
当我在我的网络应用程序中运行并调试时,它每次都会返回信息,确实出了问题,我无法弄清楚..

PS:它的目的是获取OTServer信息。

最佳答案

我认为这不是从 br 读取内容的正确方法。

while (br.ready()) {
        stb.append(br.readLine());
}

尝试将其更改为:

String line = null;
while ((line = br.readLine()) != null) {
        stb.append(line);
}

此外,在此行之后调用os.close()

os.write(info.getBytes());

关于Java Socket 不返回流中的任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21699467/

相关文章:

c# - 如何更好地减少类依赖性以便更容易对其进行单元测试

c# - WCF 无法使用无线建立到笔记本电脑

c# - 在 C# 中通过套接字发送信息

java - 如何使用 Netbeans IDE 8.0 为 Web 应用程序创建 jar 文件

java - 行星超出了数字框

java - 高效地发送多封电子邮件

macos - 无法取消链接套接字文件/tmp/mongodb-27017.sock errno :13 Permission denied

c# - 在 C# 中从服务器向客户端发送一些约束

linux - Linux 上机器之间的 tcp/ip 连接数是否有限制?

java - 在应用程序级别调整 TCP 数据包大小以实现最大吞吐量