简单的Java TCP服务器和PHP客户端问题

5
我正在尝试在单个端口上建立简单的TCP连接,使用Java应用程序作为TCP服务器和PHP脚本作为客户端。以下是每个代码,但问题是:我可以成功连接并发送数据到Java服务器,可以接收并打印出该数据。我的问题在于尝试向php服务器发送响应时出现了问题。当我注释掉PHP的最后一行“echo socket_read($socket, 14, PHP_NORMAL_READ);”时,数据能够成功传送到Java服务器。但当我重新添加该行时,数据甚至无法传送到Java服务器。因此,我认为我的问题可能与我如何从Java发送数据或尝试从服务器中获取数据相关。这让我感到困惑,请给予帮助!Java服务器:
protected ServerSocket socket;
protected final int port = 9005;
protected Socket connection;
protected String command = new String();
protected String responseString = new String();


socket = new ServerSocket(port);


while(true)
{
    // open socket
    connection = socket.accept();
    // get input reader
    InputStreamReader inputStream = new InputStreamReader(connection.getInputStream());
    BufferedReader input = new BufferedReader(inputStream);
    // get output handler
    DataOutputStream response = new DataOutputStream(connection.getOutputStream());

    // get input
    command = input.readLine();

    // process input
    Logger.log("Command: " + command);
    responseString = command + " MC2 It Works!";

    // send response
    response.writeBytes(responseString);
    response.flush();
    response.close();
}

PHP客户端:

$address = 'example.com'; // obviously not the address I am using
$port = 9005;
$message = "Test";

$socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));

socket_connect($socket, $address, $port)

if(socket_send($socket, $message, strlen($message), MSG_EOF) != FALSE)
{
    echo socket_read($socket, 14, PHP_NORMAL_READ);
}

1
responseString = command + " MC2 它工作了!"+"\r\n"; - clevertension
我认为你必须添加行的EOF,以便套接字知道你已经完成发送数据。 - clevertension
是的,那肯定是问题的一部分。我在提交问题后大约20分钟就解决了所有问题。这就是生活。 - KayoticSully
1
干得好,KayoticSully。友情提醒,您能否自己发布一个答案并接受该答案,以便我们关闭这个问题?也许您还没有足够的声望,但请记住,如果需要,您可以和应该回答自己的问题。 - Zecas
谢谢,我实际上忘记了这个。一旦解决了这个问题,我就会稍微沉迷于我正在处理的其他事情,并且它从我身边溜走了。希望这可以帮助到某人。 - KayoticSully
1个回答

2

解决方案:我找到了问题所在。当从Java服务器读取数据时,我只读取了一部分,而其他部分都卡住了。需要使用循环读取所有数据。

此外,我发送给Java服务器的数据没有以换行符或回车符结尾。

下面是重新编写的PHP客户端,现在整个过程都可以正常工作。

$address = 'minecraft.kayoticgamer.com';
$port = 9005;

$socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
socket_connect($socket, $address, $port);

$message .= chr(10);

$status = socket_sendto($socket, $message, strlen($message), MSG_EOF, $address, $port);
if($status !== FALSE)
{
    $message = '';
    $next = '';
    while ($next = socket_read($socket, 4096))
    {
        $message .= $next;
    }

    echo $message;
}
else
{
    echo "Failed";
}

socket_close($socket);

你好,KayoticSully:我尝试运行你的示例,但浏览器中一直显示加载中,请帮助我,如果你已经解决了这个问题。 - V.P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接