2013-07-28 66 views
0

我正嘗試在服務器和客戶端之間創建數據傳輸。連接已建立,但服務器和客戶端之間沒有數據傳輸。 服務器端:線程中的Java套接字 - 無數據傳輸

public static void CreateServerSocket() { 
    try { 
     server = new ServerSocket(9999); 
     t = new Thread(new SocketServer()); 
     t.start(); 
    } catch (IOException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

public static void closeServer() { 
    try { 
     server.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

public static void sentSide(String side) { 
    out.print(side); 
} 

@Override 
public void run() { 

    try { 
     client = server.accept(); 
     out = new PrintWriter(client.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     out.print("test from server"); 
     while (true){ 
      strIn=in.readLine(); 
      System.out.println(strIn); 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

客戶端:

public class SocketClient implements Runnable { 

static Socket client; 
static Thread t; 
static PrintWriter out; 
static BufferedReader in; 
static String strIn; 

public static boolean CreateClientSocket(InetAddress ip) { 
    try { 
     client = new Socket(ip, 9999); 
     t = new Thread(new SocketClient()); 
     t.start(); 
     return true; 
    } catch (UnknownHostException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
     return false; 
    } catch (IOException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
     return false; 
    } 
} 

public static void closeClient() { 
    try { 
     client.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

@Override 
public void run() { 
    try { 
     out = new PrintWriter(client.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     out.print("test from client"); 
     while (true) { 
      strIn = in.readLine(); 
      System.out.println(strIn); 
      DialogMultiplayerStart.setSide(strIn); 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(SocketClient.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

的問題是,的out.print不發送數據。連接已建立,因爲CreateClientSocket返回true,但out.print(「來自客戶端/服務器的測試」)都不起作用,也沒有setSide方法。在此先感謝您的幫助。

+0

你試過'out.flush()'嗎? – Desert

回答

4

客戶端開始做

out.print("test from client"); 

,然後等待來自服務器的整條生產線:

strIn = in.readLine(); 

服務器通過做

out.print("test from server"); 

,然後等待來自客戶端的全線:

strIn = in.readLine(); 

所以,雙方都在等待對方發送一個行尾:死鎖。

將其更改爲

out.println("test from server"); 

out.println("test from client"); 

走得更遠一點。但是,你會遇到另外一個問題:雙方都會無限循環地閱讀,而不會再發送更多內容。

+0

非常感謝。我把'print'改成了'println',並且在條件變成'while((strIn = in.readLine())!= null)'的時候改變了。但問題是方法sentSide仍然沒用。 – lozga

+0

再次閱讀我的答案的結尾:雙方試圖讀取來自對方的線。但是雙方都沒有寫任何東西。你應該有一個對話:服務器寫入和客戶端讀取。然後客戶端寫入和服務器讀取等。如果兩者都在同一時間讀取,則不會發生任何事情,並且一切都被阻止。 –

+0

那麼,一段時間的變化是沒有幫助的? – lozga