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

问题描述:

我试图在一个单一的端口上建立一个简单的TCP连接,用于作为TCP服务器的Java应用程序和作为客户端的PHP脚本。

I am trying to set up a simple TCP connection on a single port between a Java application that will act as the TCP server and a PHP scrip that will act as the Client.

我将为每个下面的代码,但问题是:
我可以连接和发送数据到Java服务器很好。我可以得到这些数据并打印出来。

I will post the code for each below, but the problem is: I can connect and send data to the Java server just fine. I can get that data and print it out. My problem arises in trying to send a response back to the php server.

当我注释掉最后一行phpecho socket_read($ socket,14,PHP_NORMAL_READ)时,我的问题出现在尝试发送响应回到php服务器。 ;数据到达Java服务器就好了。当我添加该行时,数据甚至不会到达Java服务器。

When I comment out that last line of php "echo socket_read($socket, 14, PHP_NORMAL_READ);" The data gets to the Java server just fine. When I add that line back in, the data does not even get to the Java server.

因为这个,我假设我的问题有关我如何

Because of this, I am assuming my problem has something to do with how I am either sending the data from Java, or trying to get the data in PHP from the server.

这让我真的很累,任何帮助将非常感谢!

This has me really stumped, any help would be greatly appreciated!

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客户端:

PHP Client:

$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);
}


我想出了什么问题。当从Java服务器读回数据时,我只读一个块,一切都挂在其余的。数据需要在一个循环中读取以获得所有的数据。

SOLVED: Here is the solution I figured out what the problem was. When reading data back from the Java server, I was only reading one chunk and everything was hanging on the rest. The data needs to be read in a loop to get all of it.

此外,我发送到Java服务器的数据不是以一个新行或回车结束。

Also The data I was sending to the Java Server was not ending in a new line or carriage return.

以下重写的PHP客户端现在可以使整个事情正常工作

the following re-written PHP client now make the entire thing work nicely

$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);