【问题标题】:Java Socket Server hangs while reading dataJava Socket Server 在读取数据时挂起
【发布时间】:2019-07-23 23:19:24
【问题描述】:

我有一个与 Java 套接字服务器通信的 PHP 文件,当我发送数据时,我的 Java 服务器在 inputLine = in.readLine() 上卡住(挂起、冻结)。我调试了一下,发现只有在读取数据的时候才会出现这种情况。

这是我的服务器 java 方法:

public void start_echo_server(int port){
    main.getProxy().getConsole().sendMessage(new TextComponent(ChatColor.GOLD + "STARTING SOCKET LISTENER (echo)"));

    int portNumber = port;
    try {
        ServerSocket serverSocket = new ServerSocket(portNumber);
        Socket clientSocket = serverSocket.accept();
        // accepted the connection
        main.getProxy().getConsole().sendMessage(new TextComponent(ChatColor.GOLD + "ACCEPTED"));
        // in stream
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        // outstream
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

        String inputLine;
        StringBuilder sb = new StringBuilder();
        while ((inputLine = in.readLine()) != null) {
            sb.append(inputLine);
        }
        String final_line = sb.toString();
        main.getProxy().getConsole().sendMessage(new TextComponent(ChatColor.GOLD + "IN: " + final_line));
        //String final_ret = parser.parse_message(final_line);
        //main.getProxy().getConsole().sendMessage(new TextComponent(ChatColor.GOLD + "FINAL: " + final_ret));
        out.println(final_line);
        in.close();
        out.close();
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是我的 PHP 文件:

    <?php
  if( isset($_POST['username']) )
  {
     $username = $_POST['username'];
     parse($username);
  }else{
    echo "Missing parameters!";
    exit();
  }
  function parse($username){
    //Must be same with server
    $host = "127.0.0.1";
    $port = 59090;
    // No Timeout
    //Create Socket
    $sock = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
    //Connect to the server
    $result = socket_connect($sock, $host, $port) or die("Could not connect toserver\n");
    $message = "player_online ". $username;
    //Write to server socket
    $len = strlen($message);

    socket_write($sock, $message, $len) or die("SENDING ERROR ". $message ." \n");
    //Read server respond message
    $result = socket_read($sock, 1024) or die("RESPONSE ERROR ". $message ." \n");
    echo "Reply From Server  :".$result;
    //Close the socket
    socket_close($sock);
  }
?>

问题是当我在 PHP 端执行 socket_write(写入数据)时,但问题出在 java 行 while ((inputLine = in.readLine()) != null) {

非常感谢!

【问题讨论】:

  • Readline 读取一个“行”,它是以三个不同换行序列中的任何一个结尾的字符序列。您的 PHP 客户端是否发送换行符?看起来不像。

标签: java php sockets freeze


【解决方案1】:

解决了!

我正在阅读多行,只有一行进入,而我没有在消息之后包含换行符 (\n)(这表示上一条消息是已完成的一行)。 将 PHP $message = "player_online ". $username; 替换为 $message = "player_online ". $username ."\n";

也不得不替换Java

String inputLine;
StringBuilder sb = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
    sb.append(inputLine);
}
String final_line = sb.toString();

String inputLine = in.readLine();
String final_line = inputLine;

【讨论】:

    【解决方案2】:

    尝试将 while 条件更改为您控制的东西作为概念证明,即在 1 分钟左右的时间内阅读,如果这让 ypu 卡住了,那么在 in.readline 中也不要阅读,但要找到其他东西,它发生在我的一些 ssh 连接上,然后我们将 while 条件设置为在通道打开时读取...如果您没有根据上述概念证明进行某些操作,将尝试找到该代码并将其添加到此处

    【讨论】:

    • 1) 由于拼写错误,我很难理解您的回复 2) 我试过这个,但在受控条件下从循环内部读取时仍然得到相同的结果
    • 我的错,我在手机上写,没有意识到...明天会尝试获取代码,它是用于 ssh 连接但有同样的问题,道歉
    • 你很好,我没有意识到你在打电话。这适用于我的情况吗? (ssh 与套接字)
    • 不完全确定但是,ssh 最终会打开一个套接字,我记得我们是从 JCabi ssh 连接类中得到的,因为我们遇到了完全相同的问题,我会在明天尝试,希望有人回答你之前所以你停止与这个 issie 斗争,因为它很烂
    猜你喜欢
    • 2011-02-23
    • 2020-06-19
    • 2017-09-18
    • 1970-01-01
    • 2016-07-20
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多