我是Java和Android的新手,我正在尝试创建一个服务器/客户端应用程序。目前我在PC上运行服务器,客户端在Android设备上。通信发生并且一切正常,但我想区分来自客户端的传入消息,以便在服务器上执行不同的操作。这是服务器的代码。客户很简单,运作良好。例如,当我从客户端发送“姓名”时,服务应回答“Matteo”,但它总是回答“其他”,我不明白为什么!我想问题出现在if (dataInputStream.equals("Name")) {
谢谢。
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();
}
}
}
}
}
}
答案 0 :(得分:3)
DataInputStream
表示来自套接字的数据流的句柄,但不代表数据本身。因此.equals()
将其与另一个DataInputStream
进行比较,而不是String
。您将它直接与字符串进行比较,显然会返回false
。
就像您使用writeUTF()
编写数据一样,您需要通过DataInputStream
从套接字连接中读取数据。使用read()
描述的BufferedReader
方法之一,或者如果您知道客户端将发送整行,您可以将其包装在BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(dataInputStream));
String input = bufferedReader.readLine();
if (input.equals("Name")
{
dataOutputStream.writeUTF("Matteo!");
}
else ...
中并使用以下内容:
switch
另一方面,在Java 7中,您也可以在String上使用.equals()
语句,而不是{{1}}
答案 1 :(得分:2)
诀窍是你应DataInputStream
来byte[] buffer = new byte[ 1024 ];
dataInputStream.read( buffer );
if ( new String( buffer ).equals( "Name" ) ) { /* do your stuff */ }
。例如
{{1}}
这是很多缩写,但你可以在那里工作。
干杯,
答案 2 :(得分:1)
也许看一下ObjectInputStream
你可以读取对象并使用:
instanceof
关键字以区分对象