2017-02-27 152 views
1

我試圖用echo回答客戶端消息,但我不知道如何去做。我的客戶端發送的消息,但後來我扭轉文件和程序不進行(卡符合客戶端 - 服務器消息交換 - Java中的套接字

DataOutputStream類出=新DataOutputStream類(clientSocket.getOutputStream());

服務器的

)。我想這是關於輸入流,但是當我這樣做時,會關閉套接字,我無法重用它。我已經做到了這一點與readUTF和socket.shutDownInput做到了這一點,但我想要一個最簡單的方法 - 像close或flush,這是我沒有得到的。

客戶

public class SocketClient { 

public static void main(String[] args) throws IOException { 
    // Check arguments 
    if (args.length < 3) { 
     System.err.println("Argument(s) missing!"); 
     System.err.printf("Usage: java %s host port file%n", SocketClient.class.getName()); 
     return; 
    } 

    String host = args[0]; 
    // Convert port from String to int 
    int port = Integer.parseInt(args[1]); 
    // Concatenate arguments using a string builder 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 2; i < args.length; i++) { 
     sb.append(args[i]); 
     if (i < args.length-1) { 
      sb.append(" "); 
     } 
    } 
    String text = sb.toString(); 

    // Create client socket 
    Socket socket = new Socket(host, port); 
    System.out.printf("Connected to server %s on port %d %n", host, port); 

    // Create stream to send data to server 
    DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 

    // Send text to server as bytes 
    out.writeBytes(text); 
    out.writeBytes("\n"); // devia meter readline a null... 

    System.out.println("Sent text: " + text); 

    System.out.println(socket.getInetAddress().getHostAddress() + " " + socket.getPort()); 

    //out.close(); 
    //socket.shutdownOutput(); trials... 
    //////////////////////////////////////////// 

    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

    System.out.println("here"); 
    // Receive data until client closes the connection 
    String response; 
    while ((response = in.readLine()) != null) 
     System.out.printf("Received message with content: '%s'%n", response); // here is where client doesn't proceed - he doesn't get the echo 

服務器

public class SocketServer { 

public static void main(String[] args) throws IOException { 
// Check arguments 
if (args.length < 1) { 
System.err.println("Argument(s) missing!"); 
System.err.printf("Usage: java %s port%n", SocketServer.class.getName()); 
     return; 
    } 

    // Convert port from String to int 
    int port = Integer.parseInt(args[0]); 

    // Create server socket 
    ServerSocket serverSocket = new ServerSocket(port); 
    System.out.printf("Server accepting connections on port %d %n", port); 

    // wait for and then accept client connection 
    // a socket is created to handle the created connection 
    Socket clientSocket = serverSocket.accept(); 
    System.out.printf("Connected to client %s on port %d %n", 
     clientSocket.getInetAddress().getHostAddress(), clientSocket.getPort()); 

    // Create stream to receive data from client 
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

    // Receive data until client closes the connection 
    String response; 
    while ((response = in.readLine()) != null) 
     System.out.printf("Received message with content: '%s'%n", response); 

    ///////////////////////////////////////////// 


    DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream()); // he doesn't reach here 

    System.out.println("here-serv"); 

    System.out.println(clientSocket.getInetAddress().getHostAddress() + " " + clientSocket.getPort()); 
    // Send text to server as bytes 
    out.writeBytes("echo"); 

其實我相信這個問題已經從服務器,它是沒有得到一個空readline的東西 - 但客戶端發送一個「\ n」!你能找到我的代碼錯誤嗎?由於

+0

我DONOT知道多少關於套接字,但爲什麼你不想去建立一個實時聊天服務器的Firebase雲消息傳遞? –

+0

我不想建立這個,這只是一個實驗。簡單地使雙方發送和接收,這就是它... – samthegolden

+0

一個插座將阻塞,直到它關閉,並且輸出流應該使用'flush()' –

回答

-1

確定我想通了,readline的永遠不會收到一個空,直到連接如流被關閉......那麼停工狀態是矯枉過正 - 僅適用於發送和密切conections ...

相關問題