2012-11-27 80 views
3

我是新來的Java和Android,我試圖創建一個服務器/客戶端應用程序。目前我在PC上運行服務器,客戶端在Android設備上。通信發生並且一切正常,但我想區分來自客戶端的傳入消息,以便在服務器上執行不同的操作。這是服務器的代碼。客戶端非常簡單,運行良好。例如,當我從客戶端發送「姓名」時,服務器應該用「Matteo」來回答,但它總是用「其他」來回答,我不明白爲什麼!我想象這個問題是在聲明if (dataInputStream.equals("Name")) {Android的TCP套接字客戶端/服務器實現

謝謝。

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class Server1 { 

public static void main(String[] args){ 
    ServerSocket serverSocket = null; 
    Socket socket = null; 
    DataInputStream dataInputStream = null; 
    DataOutputStream dataOutputStream = null; 

    try { 
    serverSocket = new ServerSocket(8888); 
    System.out.println("Listening on port 8888"); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

    while(true){ 
    try { 
    socket = serverSocket.accept(); 
    dataInputStream = new DataInputStream(socket.getInputStream()); 
    dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
    System.out.println(socket.getInetAddress() + " : " + dataInputStream.readUTF()); 

    if (dataInputStream.equals("Name")) { 
     dataOutputStream.writeUTF("Matteo!"); 

    } 
    else if (dataInputStream.equals("Surname")) { 
     dataOutputStream.writeUTF("Rossi!"); 

    } 
    else { 
     dataOutputStream.writeUTF("Something else!"); 

    } 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
    finally{ 
    if(socket!= null){ 
    try { 
     socket.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 

    if(dataInputStream!= null){ 
    try { 
     dataInputStream.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 

    if(dataOutputStream!= null){ 
    try { 
     dataOutputStream.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 
    } 
    } 
} 
} 

回答

2

的技巧是,你應該從DataInputStreamread東西。例如。

byte[] buffer = new byte[ 1024 ]; 
dataInputStream.read(buffer); 
if (new String(buffer).equals("Name")) { /* do your stuff */ }  

這是縮寫,但你可以從那裏工作。

乾杯,

3

DataInputStream代表手柄流數據從插座來的,而不是數據本身。因此.equals()將其與另一個DataInputStream進行比較,而不是與String進行比較。你直接將它與一個字符串進行比較,顯然返回false

就像你用writeUTF()寫數據一樣,你需要通過DataInputStream從套接字連接讀取數據。的read()方法使用一個描述here或者,如果你知道你的客戶端將發送整行,你可以在一個BufferedReader包裹,並使用以下命令:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(dataInputStream)); 
String input = bufferedReader.readLine(); 
if (input.equals("Name") 
{ 
    dataOutputStream.writeUTF("Matteo!"); 
} 
else ... 

在另一方面,在Java 7,您可以使用對字符串switch陳述過,而不是.equals()

+0

感謝您的回覆,使用此解決方案,通信根本不起作用,因爲服務器從客戶端接收到按摩消息,但它不會回覆客戶端,也不會迴應「其他」 。 – phcaze

+0

如果您正在使用此解決方案,則客戶端必須在消息結尾處發送新的行分隔符,以便readLine()正常工作。所以它必須發送「名稱\ n」。否則服務器會一直等待\ n。所以這個解決方案只有在客戶端發送整行時纔有效。 (即由換行符\ n分隔符分隔)。否則,使用我提供的URL頁面中描述的'DataInputStream'提供的'read()'方法。 – jbx

1

也許考慮的ObjectInputStream那麼你可以閱讀對象,並使用:

instanceof 

關鍵字迪菲對象之間的糾錯