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

时间:2012-11-27 11:17:00

标签: java android sockets tcp inputstream

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

3 个答案:

答案 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)

诀窍是你应DataInputStreambyte[] buffer = new byte[ 1024 ]; dataInputStream.read( buffer ); if ( new String( buffer ).equals( "Name" ) ) { /* do your stuff */ } 。例如

{{1}}

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

干杯,

答案 2 :(得分:1)

也许看一下ObjectInputStream你可以读取对象并使用:

instanceof

关键字以区分对象