PHP和Java套接字通信。 socket_read()挂起

时间:2018-10-15 14:58:35

标签: java php sockets

在过去的几天里,我和一个朋友一直在摆弄PHP套接字,试图使其与Java服务器套接字进行通信。我们尝试了多种不同的方法/解决方案,并仔细研究了许多类似的问题/解决方案,但无济于事。

对于我当前拥有的代码(因为我记不清我所做或尝试的所有更改),socket_send()有效,并且java服务器接收到该消息。但是有趣的是,如果socket_read()在PHP文件中,则最后显示到Java控制台的内容是“客户端响应:...”,但是如果注释了socket_read(),它将遍历整个Java程序。

我不太确定为什么会发生这种情况,但是我猜这是未将数据读入PHP脚本的原因。我知道它到达了socket_read()代码,因为如果我强制关闭服务器,我会收到“警告:socket_read():无法从套接字读取[10054]:远程主机强行关闭了现有连接。”

PHP文件

<?php 
$host = "localhost";
$port = 1000;

echo "Creating Socket...<br>";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket");

echo "Connecting to host...<br>";
$connection = socket_connect($socket,$host,$port) or die("Could not connect to host");

$message ="Message to send".PHP_EOL;
socket_send($socket,$message,strlen($message),0);

sleep(10);
echo "Done sleep";
while (($buffer = socket_read($socket, 1024))!=false) {
    echo("Data sent was:" . $buffer . "<br>");
}

socket_close($socket);
?>

Java文件

try {
    ServerSocket serverSocket = new ServerSocket(1000);

    Socket currentClient = null;
    while(currentClient == null) {
        try {
            // accepts incoming socket connection
            currentClient = serverSocket.accept();
            if(currentClient!=null) {
                System.out.println("Client Connected: " + currentClient);

                //create streams for socket
                OutputStream out = currentClient.getOutputStream();
                PrintWriter os = new PrintWriter(new OutputStreamWriter(out));
                    BufferedReader br = new BufferedReader(new InputStreamReader(currentClient.getInputStream()));

                String line = null;
                while ((line = br.readLine()) != null) {
                    System.out.println("Client response: " + line);
                }

                System.out.println("Writing to os");
                os.println("Hello world\r\n");

                System.out.println("flushing OS");
                os.flush();

                System.out.println("Done");

                os.close();
                out.close();
                br.close();
                currentClient.close();
            }

        }catch(Exception ex){
            currentClient.close();
            ex.printStackTrace();
        }
    }
    serverSocket.close();
} catch (IOException e) {
    e.printStackTrace();
}

编辑 我删除了Java文件中的while循环,现在可以正常运行了,这很奇怪,但是不适用于临时修复。显然,如果发送多行,则只会读取第一行。仍然不确定为什么如果不存在socket_read,它为何可以工作。

0 个答案:

没有答案