簡體   English   中英

Java Socket Server在讀取數據時掛起

[英]Java Socket Server hangs while reading data

我有一個與Java套接字服務器通信的PHP文件,當我發送數據時,我的Java服務器卡在inputLine = in.readLine()上(掛起,凍結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) {

非常感謝!

解決了!

我正在讀取多行,但只有一行輸入,而在消息后沒有包含換行符( \\n )(這表示上一條消息是已完成的行)。 替換PHP $message = "player_online ". $username; $message = "player_online ". $username; $message = "player_online ". $username ."\\n"; $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;

嘗試將while條件更改為您可以控制的概念證明,即在1分鍾左右的時間內閱讀,如果ypu卡住了,則在in.readline中也不閱讀,但又找到了其他東西,它在某些ssh連接上發生在我身上,然后將while條件設置為在通道打開時讀取...如果您根據上述概念證明不熟悉,將嘗試找到該代碼並將其添加到此處

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM