【问题标题】:Simple Java TCP Server and PHP Client Problems简单的 Java TCP 服务器和 PHP 客户端问题
【发布时间】:2012-06-11 11:17:07
【问题描述】:

我正在尝试在充当 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();
}

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

【问题讨论】:

  • responseString = command + " MC2 It Works!"+"\r\n";
  • 我认为您必须添加套接字知道您完成发送数据的行的EOF
  • 是的,这绝对是问题的一部分。提交问题后大约 20 分钟,我想通了。生活也是如此。
  • 干得好 KayoticSully。友情提示,您能否自行发布问题的答案,然后接受该答案,以便我们关闭此问题?可能您还没有足够的声誉,但请记住,如果需要,您可以而且应该回答自己的问题。
  • 谢谢,我实际上忘记了这一点。一旦我解决了这个问题,我就开始有点全神贯注于我正在做的其他事情,并且它远离了我。希望这可以帮助某人。

标签: java php client-server


【解决方案1】:

已解决:这是我找出问题所在的解决方案。从 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 :我尝试运行您的示例,但它会在浏览器中显示连续加载,如果您已经完成,请帮助我。
猜你喜欢
  • 2011-11-16
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多