2017-06-08 69 views
0

編輯:問題是Client.class中的輸入,以便Android設備從服務器接收到答案時。這些是以下行導致崩潰:Android客戶端套接字IOException

 InputStream input = client.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 

     String text; 

     while ((text = reader.readLine()) != null) { 
      Log.d("ClientLog", "Received from Server"+ text); 
     } 

這裏是我的Client.class在安卓

public class Client implements Runnable{ 

public Client() { 

} 

@Override 
public void run() { 
    try { 
     Log.d("ClientLog", "Socket creation incoming"); 
     Socket client = new Socket("localhost", 5555); 
     Log.d("ClientLog", "Client has been started"); 

     // Streams: 
     OutputStream out = client.getOutputStream(); 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 

     InputStream input = client.getInputStream(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
     // ----------------------------------------------------------------------- 

     writer.write("Test"); 
     writer.newLine(); 
     writer.flush(); 

     String text; 

     while ((text = reader.readLine()) != null) { 
      Log.d("ClientLog", "Received from Server"+ text); 
     } 

     writer.close(); 
     reader.close(); 

    } catch (UnknownHostException e) { 
     Log.d("ClientLog", "Error: Host not found"); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     Log.d("ClientLog", "Error: IOException"); 
     e.printStackTrace(); 
    } 
} 

}

,如果需要,我Server.class在Java中:

public class Server { 

public static void main(String[] args) { 

    ExecutorService executor = Executors.newFixedThreadPool(30); 

    ServerSocket server; 
    try { 
     server = new ServerSocket(5555); 
     System.out.println("Server has been started on Port 5555"); 

     while(true) { 
      try { 
       Socket client = server.accept(); 

       //Thread t = new Thread(new Handler(client)); 
       //t.start(); 
       executor.execute(new Handler(client)); 

      } catch (IOException e) { 
       System.out.println("Error IOExceotion"); 
       e.printStackTrace(); 
      } 
     } 

    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

} 

Server.class所需的Handler.class:

public class Handler implements Runnable{ 
private Socket client; 

public Handler(Socket pClient) { 
    client = pClient; 
} 

@Override 
public void run() { 
    try { 
       // Streams: 
       OutputStream out = client.getOutputStream(); 
       PrintWriter writer = new PrintWriter(out); 

       InputStream input = client.getInputStream(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
       // ----------------------------------------------------------------------- 

       String text = null; 

       while ((text = reader.readLine()) != null) { 
        writer.write(text+ "\n"); 
        writer.flush(); 
        System.out.println("Recieved from Client: "+ text); 
       } 

       //Close Streams 
       writer.close(); 
       reader.close(); 

       client.close(); 
    } catch (IOException e) { 
     System.out.println("Error IOException"); 
     e.printStackTrace(); 
    } 
} 

}

+0

IOException應該表示客戶端無法建立到服務器的連接。如果您使用的是手機等Android設備,則可能需要啓用某些權限。你有沒有看過? https://stackoverflow.com/questions/4074808/java-socket-ioexception-permission-denied – user2570465

+0

@ user2570465是的,我讀過這篇文章,我得到了所有的Internet權限。如果我將應用程序加載到我的Android手機,服務器將獲得測試消息,但應用程序崩潰。所以連接問題可能來自Android模擬器 – Urbs

+0

好的。所以上面描述的錯誤與'Socket client = new Socket(「localhost」,5555);'上的IOException一樣是固定的,現在有一個新的錯誤?你想編輯細節和追溯? – user2570465

回答

1

調試在上面的評論得到了解決。

第1步:添加權限到Android清單文件是這裏概述:Java socket IOException - permission denied

第2步:更改while ((text = reader.readLine()) != null)檢查。我想text = reader.readLine() != null檢查是有問題的。