【问题标题】:Android TCP socket client/server implementationAndroid TCP 套接字客户端/服务器实现
【发布时间】:2012-11-15 00:04:16
【问题描述】:

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

【问题讨论】:

    标签: java android sockets tcp inputstream


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回复,使用此解决方案通信根本不起作用,因为服务器接收到来自客户端的消息但它没有回复客户端,也没有“某事其他”。
    • 如果您使用此解决方案,您的客户端必须在消息末尾发送一个新的行分隔符才能使 readLine() 工作。所以它必须发送“name\n”。否则服务器会一直等待\n。所以这个解决方案只有在客户端发送整行时才有效。 (即由换行符 \n 分隔符分隔)。否则使用我提供的URL页面中描述的DataInputStream提供的read()方法。
    【解决方案2】:

    诀窍是你应该read 来自DataInputStream 的东西。例如。

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

    这是 much 的缩写,但您可以从那里开始工作。

    干杯,

    【讨论】:

      【解决方案3】:

      也许查看ObjectInputStream,然后您可以读取该对象并使用:

      instanceof
      

      区分对象的关键字

      【讨论】:

        猜你喜欢
        • 2015-09-16
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2019-01-31
        • 2012-03-29
        • 2016-02-08
        • 1970-01-01
        • 2022-01-26
        相关资源
        最近更新 更多