java - PHP socket_read() 和 socket_recv() 问题

标签 java php sockets networking

编辑:我已经解决了自己的问题并修复了下面的代码以反射(reflect)这些更改,以防有人遇到同样的困难。此代码适用于 PHP 客户端和 java 服务器连接。

我知道论坛上充斥着这些问题...但是,在八个多小时的时间里,我几乎尝试了所有其他方法,却束手无策。我正在尝试将字符串从 java 套接字发送到 PHP 套接字。我是 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() 的方法(尽管可能不正确)。正如您从我的“选项:”评论中看到的,我在这里也尝试了几种不同的方法,但没有效果。我可能会错过什么?提前非常感谢您!

最佳答案

根据the manual , socket_recv() 将返回一个整数,即接收到的字节数。

问题是 false !==,您不应该在此处使用它(因为 socket_recv() 返回一个整数)。这个条件应该足够了:

while(0 != socket_recv($socket, $out, 1024)){
      if($out != null)
        $fullResult .= $out;
    };

您可能对 socket_last_error() 感兴趣.

关于java - PHP socket_read() 和 socket_recv() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17884737/

相关文章:

java - Maven存储库更新和维护

java - 我如何使用java搜索用户确定的单词并计算文本文件中的出现次数?

php - 如何将这个 "R"公式翻译成MySQL/PHP?

java - 线程 "main"java.lang.NoClassDefFoundError : calculator (wrong name: apackage/calculator) 中出现异常

java - Jersey:接受 Enum 请求参数的整数

javascript - 如果之前已经打开,则重定向到不同的页面

php - ‘where 子句中的未知列?

Java读取超时不起作用

java - ArrayList<Object> 发送槽套接字

c - 为什么我不能在 ai_socktype 中使用 SOCK_RAW?