3

我是 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();
     }
    }
   }
  }
 }
}
4

3 回答 3

3

DataInputStream表示来自套接字的数据流的句柄,而不是数据本身。所以.equals()将它与另一个DataInputStream而不是与 a进行比较String。您直接将其与一个字符串进行比较,该字符串显然返回false.

就像您正在使用 写入数据一样writeUTF(),您需要通过它从套接字连接读取数据DataInputStream。使用此处read()描述的方法之一,或者如果您知道您的客户端将发送整行,您可以将其包装在 a 中并使用以下内容:BufferedReader

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

另一方面,在 Java 7 中,您也可以switch在 String 上使用语句,而不是.equals()

于 2012-11-27T11:41:01.153 回答
2

诀窍是您应该DataInputStream. 例如。

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

这是很多缩写,但你可以从那里工作。

干杯,

于 2012-11-27T11:21:46.613 回答
1

也许研究一下,ObjectInputStream然后您可以读取对象并使用:

instanceof

区分对象的关键字

于 2012-12-19T04:28:34.590 回答