2012-03-24 18 views
1

我正在嘗試將服務器寫入客戶端程序,但無法與Java中的服務器通信。無法與Java中的服務器通信

這裏是我的主要代碼塊。

InetAddress addr = InetAddress.getLocalHost(); 
    ipAddress = "78.162.206.164"; 
    ServerSocket serverSocket = new ServerSocket(0); 
    String randomStringForPlayerName = RandomStringGenerator.generateRandomString(); 

    baseForReqOpp += ipAddress + " " + serverSocket + " " + randomStringForPlayerName; 
    Socket socket = new Socket(host,2050); 
    socket.setSoTimeout(100); 

    in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    out = new PrintWriter(socket.getOutputStream()); 
    out.write(baseForReqOpp); 
    out.flush(); 

    System.out.println(in.read()); 

我知道有一個在服務器代碼沒有問題,所有的通訊端口都OK。

但我無法從服務器讀取任何東西。

可能是什麼問題?

+2

你剝奪了太多的實際代碼。 'host'永遠不會被定義或初始化。 – unholysampler 2012-03-24 14:03:14

+0

你真的在使用端口0,你是'ServerSocket'嗎? – John 2012-03-24 14:15:29

+0

@John:從發佈的內容來看,他只使用它來構建'baseForReqOpp'。這是另一個未在此代碼中初始化的變量。這也是重要的,因爲字符串被追加到。 – unholysampler 2012-03-24 14:18:14

回答

3

你輸入流

+0

這應該沒關係,你可以有一個輸入流和一個輸出流在連接上打開,並沒有關係哪一個是初始化的第一個 – John 2012-03-24 14:11:34

+0

我認爲是這樣,它不起作用 – brtb 2012-03-24 14:20:03

2

這裏之前創建一個輸出流與通信客戶端和服務器套接字一些工作代碼。希望你能適應你的具體問題。

public class SocketTest { 

    public void runTest() { 
     try { 
      // create the server 
      new SimpleServer().start(); 
      // connect and send a message 
      InetAddress addr = InetAddress.getLocalHost(); 
      Socket sock = new Socket(addr, 9090); 
      ObjectOutputStream out = new ObjectOutputStream(sock.getOutputStream()); 
      out.writeObject("Hello server"); 
      out.flush(); 
      ObjectInputStream in = new ObjectInputStream(sock.getInputStream()); 
      System.out.println("from server: " + in.readObject()); 
      sock.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    // server has to run in a separate thread so the code doesn't block 
    private class SimpleServer extends Thread { 
     @Override 
     public void run() { 
      try { 
       ServerSocket sock = new ServerSocket(9090); 
       Socket conn = sock.accept(); 
       // the code blocks here until a client connects to the server 
       ObjectInputStream in = new ObjectInputStream(conn.getInputStream()); 
       System.out.println("from client: " + in.readObject()); 
       ObjectOutputStream out = new ObjectOutputStream(conn.getOutputStream()); 
       out.writeObject("Hello client"); 
       out.flush(); 
       sock.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

運行它

new SocketTest().runTest(); 
+0

+1爲簡單和註釋示例 – John 2012-03-24 19:37:19

0

你的代碼將永遠不會工作,因爲你不使用線程。爲了開始服務器,您需要調用accept在某些時候在你的代碼

myServerSocket.accept(); 

這是一個阻塞調用,即代碼流停止,直到客戶端連接。但是由於您無法執行任何語句(請記住accept阻止?)客戶端如何連接?這個雞和雞蛋問題通過線程解決。查看Howard的代碼示例的答案。

我看不到任何accept()電話,所以我不知道你的客戶端連接到...

+0

第二個run方法的行調用accept。 – 2012-03-25 23:35:10

+0

當然,我正在和OP交談:) – Raffaele 2012-03-26 00:02:13