我是新來的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();
}
}
}
}
}
}
感謝您的回覆,使用此解決方案,通信根本不起作用,因爲服務器從客戶端接收到按摩消息,但它不會回覆客戶端,也不會迴應「其他」 。 – phcaze
如果您正在使用此解決方案,則客戶端必須在消息結尾處發送新的行分隔符,以便readLine()正常工作。所以它必須發送「名稱\ n」。否則服務器會一直等待\ n。所以這個解決方案只有在客戶端發送整行時纔有效。 (即由換行符\ n分隔符分隔)。否則,使用我提供的URL頁面中描述的'DataInputStream'提供的'read()'方法。 – jbx