2012-06-29 103 views
2

我在手機(Android)和我的服務器之間做了一個簡單的套接字。Java Socket readInt EOFException

手機能夠連接到serveur但我可以爲海誓山盟發送或讀取數據。

下面是我用我的客戶(手機端)代碼:

private static void connect(String url, int port) 
{ 
    do 
    { 
     try 
     { 
      socket = new Socket(url, port); 
      input = socket.getInputStream(); 
      output = socket.getOutputStream(); 
      inputstream = new DataInputStream(input); 
      outputstream = new DataOutputStream(output); 
      isConnected = true; 
     } 
     catch (Exception e) 
     { 
      try 
      { 
       Thread.sleep(100); 
      } 
      catch (Exception ex) {} 
     } 
    } 
    while (!isConnected); 
} 

public static String sendToServer(String json) 
{  
    try 
    { 
     connect(Constants.SERVER_HOST, Constants.SERVER_PORT); 

     if (isConnected) 
     { 
      Log.e("SOCKET MNGR", "[SOCKET] Sending " + json); 
      outputstream.writeInt(json.getBytes().length); 
      outputstream.write(json.getBytes()); 

      int arrLength = inputstream.readInt(); 
      if (arrLength > 0) 
      { 
       byte[] fromServer = new byte[arrLength]; 
       inputstream.read(fromServer, 0, fromServer.length); 
       String content = new String(Base64.decode(new String(fromServer))); 
       Log.e("SOCKET MNGR", "[SOCKET] Reading " + content); 
       return content; 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    }  

    return null; 
} 

而且一個對我的服務器:

public Client(Socket socket) 
{ 
    try 
    { 
     this.socket = socket; 
     this.input = this.socket.getInputStream(); 
     this.output = this.socket.getOutputStream(); 
     this.inputstream = new DataInputStream(this.input); 
     this.outputstream = new DataOutputStream(this.output); 
    } 
    catch (Exception e) {} 
} 

public void run() 
{ 
    while (true) 
    { 
     try 
     { 
      int arrLength = inputstream.readInt(); 
      byte[] fromClient = new byte[arrLength]; 
      inputstream.read(fromClient, 0, fromClient.length); 
      String request = new String(fromClient); 
      String read = new String(Base64.decode(request)); 
      String[] data = request.split("###"); 

      if (data.length == 2 && data[0].equals("commit")) 
      { 
       CommitInterface.commit(data[1], true); 
       outputstream.writeInt(0); 
       outputstream.write(new byte[] {}); 
      } 
      else if (data.length == 3 && data[0].equals("evaluate")) 
      { 
       EvaluateInterface.eval(data[1], data[2].equals("true") ? true : false); 
       outputstream.writeInt(0); 
       outputstream.write(new byte[] {}); 
      } 
      else if (data.length == 2 && data[0].equals("publish")) 
      { 
       String content = PublishInterface.publish(new Vector<String>(Arrays.asList(data[1].split("|")))); 
       String encoded = Base64.encode(content.getBytes()); 
       outputstream.writeInt(content.getBytes().length); 
       outputstream.write(content.getBytes()); 
      } 
     } 
     catch (Exception e) 
     { 
      this.disconnect(); 
     } 
    } 
} 

當我使用功能sendToServer我的手機上,我得到了以下日誌:

06-29 13:26:05.823: E/Kramer(1781): [SOCKET] Sending commit###{"user":"me"} 
06-29 13:26:05.823: W/System.err(1781): java.io.EOFException 
06-29 13:26:05.823: W/System.err(1781):  at java.io.DataInputStream.readInt(DataInputStream.java:287) 
06-29 13:26:05.823: W/System.err(1781):  at com.vodemki.network.KramerCommunicator.sendToServer(ServerCommunicator.java:78) 
06-29 13:26:05.823: W/System.err(1781):  at com.vodemki.activities.PhoneBookActivity$6.run(PhoneBookActivity.java:298) 

線78 int arrLength = inputstream.readInt();

任何想法,爲什麼我得到這個錯誤?

謝謝。


我試過使用UDP,我無法從智能手機讀取內容。

我的代碼如下:

服務器端:

public void run() 
{ 
    byte[] inData = new byte[48]; 
    byte[] outData = new byte[48]; 
    String message; 
    DatagramSocket socket; 

    try 
    { 
     socket = new DatagramSocket(this.port); 
     while (true) 
     { 
      DatagramPacket in = new DatagramPacket(inData, inData.length); 
      socket.receive(in); 
      InetAddress senderIP = in.getAddress(); 
      int senderPort = in.getPort(); 
      message = new String(in.getData(), 0, in.getLength()); 
      System.out.println("Got "+message+" from "+senderIP+":"+senderPort); 
      outData = "Pong".getBytes(); 
      DatagramPacket out = new DatagramPacket(outData, outData.length, senderIP, senderPort); 
      socket.send(out); 
     } 
    } 
    catch (Exception e) {} 
} 

客戶端(智能手機):

public static String sendToServer(String json) 
{  
    try 
    { 
     DatagramSocket socket = new DatagramSocket(); 
     InetAddress serverIP = InetAddress.getByName(Constants.SERVER_HOST); 
     byte[] outData = ("Ping").getBytes(); 
     DatagramPacket out = new DatagramPacket(outData,outData.length, serverIP, Constants.SERVER_PORT); 
     Log.e("kramer", "SENDING SOCKET"); 
     socket.send(out); 
     Log.e("kramer", "SOCKET SENT"); 
     socket.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    }  

    return null; 
} 

智能手機成功登錄兩條線但沒有被上收到了我服務器。任何想法?

+0

不,說實話,我沒有看到這個問題。奇怪的是...... –

+0

可以在關閉inputstream和outputstream兩個流後嘗試嗎? –

+0

@MartijnCourteaux我也試過用readUTF,但我有同樣的問題。 – Manitoba

回答

0

問題已解決。

防火牆擋住傳入的連接。我只是簡單地將端口打開爲UDP。