java - 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 不存在,仍然不确定为什么它会起作用。
解决方案
推荐阅读
- javascript - indexOf - 在字符串中搜索值,如果不做某事
- html - 创建一个对页面上其他元素的定位没有影响的 div
- reactjs - MERN 堆栈中的代理错误:无法将请求 /contact 从 localhost:3000 代理到 http://localhost:5000
- php - 如何在php中按键对数组进行切片?
- javascript - 如何根据其他键将某个对象键与 SUM 和 GROUP BY 一起计数(DISTINCT)?
- c++ - 如何将位图文件切成相等的部分并将每个部分保存在一个新的位图文件中?
- kotlin - 天气休息 api 的 URL 操作
- visual-studio-code - 节点调试 - 断点显示在只读文件中
- java - jar 文件是否不包含导入的包和类?
- html - 动画不会在半秒帧立即结束