首页 > 解决方案 > PHP 和 Java 套接字通信。socket_read() 挂起

问题描述

在过去的几天里,我和一个朋友一直在摆弄 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 不存在,仍然不确定为什么它会起作用。

标签: javaphpsockets

解决方案


推荐阅读