安卓TCP套接字客户端/服务器实现

3
我是一名新手,正在学习Java和Android编程,并尝试创建一个服务器/客户端应用程序。目前我在PC上运行服务器,而客户端则在Android设备上。通信已经建立并且一切正常,但我想区分来自客户端的传入消息,以便在服务器上执行不同的操作。这是服务器的代码。客户端很简单,也可以正常工作。例如,当我从客户端发送“Name”时,服务器应该回答“Matteo”,但它总是回答“Something else”,我不知道为什么!我想问题可能出在语句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();
     }
    }
   }
  }
 }
}
3个回答

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 ...

另外,Java 7 中你也可以使用 switch 语句处理字符串,而不是使用 .equals() 方法。


谢谢回复,使用这个解决方案通信根本不起作用,服务器从客户端接收到消息,但不会回复给客户端,也不会有“其他什么东西”。 - phcaze
如果您正在使用此解决方案,则客户端必须在消息末尾发送一个新的换行符才能使readLine()正常工作。因此,它必须发送“name \ n”。否则,服务器将继续等待\n。因此,仅当客户端发送整行时(即由换行符\n分隔)才可以使用此解决方案。否则,请使用我提供的URL页面中描述的DataInputStream提供的read()方法。 - jbx

2

诀窍在于你应该从DataInputStream读取一些东西。例如:

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

这段话涉及到IT技术,但内容非常简略。你可以从这里开始工作。
祝好,
请保留HTML标签。

1

可能需要查看一下 ObjectInputStream,这样你就可以读取对象并使用:

instanceof

用于区分对象的关键字


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接