3

私はJavaとAndroidが初めてで、サーバー/クライアントアプリケーションを作成しようとしています. 今のところ、PC でサーバーを実行しており、クライアントは Android デバイスで実行しています。通信が行われ、すべて正常に動作しますが、サーバー上でさまざまなアクションを実行するために、受信メッセージをクライアントから区別したいと考えています。サーバーのコードは次のとおりです。クライアントは非常に簡単で、うまく機能します。たとえば、クライアントから「名前」を送信すると、サーブは「マッテオ」と応答するはずですが、常に「何か他のもの」と応答し、理由がわかりません! 問題は声明にあると思います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データ自体ではなく、ソケットからのデータのストリームへのハンドルを表します。そのため、 a ではなく.equals()別のものと比較します。明らかに を返す文字列と直接比較しています。DataInputStreamStringfalse

でデータを書き込んでいるのと同じように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、代わりに 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 に答える