在过去的几天里,我和一个朋友一直在摆弄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,它为何可以工作。