简单的Java TCP Server和PHP客户端问题

Kay*_*lly 5 php java client-server

我正在尝试在充当TCP服务器的Java应用程序和充当客户端的PHP脚本之间的单个端口上建立简单的TCP连接。

我将在下面发布每个代码,但问题是:我可以连接并向Java服务器发送数据。我可以获取该数据并将其打印出来。我的问题出现在尝试将响应发送回php服务器的过程中。

当我注释掉PHP的最后一行“ echo socket_read($ socket,14,PHP_NORMAL_READ);”时 数据可以很好地到达Java服务器。当我重新添加该行时,数据甚至都没有到达Java服务器。

因此,我假设我的问题与我从Java发送数据或尝试从服务器获取PHP数据有关。

这真的让我感到难过,任何帮助将不胜感激!

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();
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

Kay*_*lly 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);
Run Code Online (Sandbox Code Playgroud)