编辑:我已经解决了我自己的问题并修复了下面的代码以反映这些更改,以防任何人遇到同样的困难。此代码适用于PHP客户端和Java服务器连接。
我知道论坛上充满了这些问题...但是,我已经尝试了几乎所有其他事情超过八个小时,而且我的智慧结束了。我试图从Java Socket发送一个字符串到PHP Socket。我是一个PHP套接字新手,所以希望有人可以很容易地诊断我的问题......这是PHP代码:
<html>
<head>
</head>
<body>
<?php
//connection to NetworkService in app to manage incoming request
$addr = 'your server address';
$port = 1740;
$socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_connect($socket, $addr, $port);
//"\r\n" is very important as it signifies to the server
// that this is the end of the transmission
$request = "message to send \r\n";
//no flags needed circa php 5.2
$sent = socket_sendto($socket, $request, strlen($request), 0 , $addr, $port);
if($sent !== FALSE){
$message = '';
$next = '';
//loop through to continue appending until everything has been read
while($next = socket_read($socket, 4096)){
$message .= $next;
}
echo $message;
} else{
echo "Failed.";
}
socket_close($socket);
?>
</body>
</html>
Java代码:
public class TestServer{
public static void main(String argv[0]) throws Exception{
String in; String out = "Hello PHP\r\n";
ServerSocket inSock = new ServerSocket(1740);
while(true){
System.out.println("Now accepting connections");
Socket outSock = inSock.accept();
BufferedReader bReader = new BufferedReader(
new InputStreamReader(outSock.getInputStream()));
PrintWriter sender = new PrintWriter(outSock.getOutputStream());
in = bReader.readLine();
System.out.println("Received: " + in);
dWriter.print(out);
System.out.println("Sent: " + out);
}
}
}
问题不在于第一次发送(从PHP到JAVA),而是第二次发送(响应)只是挂起。 Java代码完全运行,因此我知道问题与socket_read()或socket_recv()函数有关。我试过sleep()并尝试使用socket_setnoblock()的方法(尽管可能不正确)。正如您在“选项:”评论中所看到的,我在这里尝试了一些不同的方法,但无济于事。我能错过什么?非常感谢你!
答案 0 :(得分:2)
根据the manual,socket_recv()
将返回一个整数,即接收的字节数。
问题是false !==
,你不应该在这里使用(因为socket_recv()
返回一个整数)。这种情况应该足够了:
while(0 != socket_recv($socket, $out, 1024)){
if($out != null)
$fullResult .= $out;
};
您可能会被socket_last_error()
感染。
答案 1 :(得分:0)
有点晚了(遇到这个寻找另一个问题。
在PHP中,尝试将套接字设置为非阻塞,然后循环,直到获得所需的“消息结束”响应(强制Java发送,如果下面是换行符)。您可以使用socket_read(因为它以换行符结束),但如果我在下面使用的代码,则使用以下内容。
socket_set_nonblock ($socket);
$receiveStartTime = microtime(true);
$response = '';
$retval = false;
while(microtime(true) - $receiveStartTime < 0.5) {
$n = @socket_recv($socket, $dataIn, 1024, 0); // Assume max return value is 1024 bytes.
if ($n) {
$response .= $dataIn;
}
if (strpos($dataIn, "\n") !== false) {
@socket_clear_error ( $socket );
$response = str_replace("\n", '', $response);
break;
}
}
if (socket_last_error($socket) > 0) {
$this->lastErrorNum = socket_last_error($socket);
$this->lastErrorMsg = 'Unable to read from socket: ' . socket_strerror($this->lastErrorNum);
@socket_clear_error ( $socket );
} else {
$retval = $response;
}