0

Java TCP サーバー プログラムを作成しました。そして、そのプログラムを自分の PC で実行します。Androidエミュレーターで実行するJava TCPクライアントプログラムを作成しました。Androidエミュレーターを使用しているため、IPアドレス10.0.2.2を使用してサーバーに接続します。しかし、パフォーマンスは非常に悪いです。サーバーは、約 8 ~ 10 分後にクライアントから送信されたデータを受信して​​います。また、エミュレーターはサーバーからデータを受信して​​いません。どこが間違っているか見てください。

TCP サーバー (PC で実行):

import java.io.*;
import java.net.*;

class TCPServer
{
   public static void main(String argv[]) throws Exception
      {
         String clientSentence;
         String capitalizedSentence=null;
         ServerSocket welcomeSocket = new ServerSocket(9000);

         while(true)
         {
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient =new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            clientSentence = inFromClient.readLine();
            System.out.println("Received: " + clientSentence);
            if(clientSentence.equals("IS COMPUTER ON?"))
            {
                capitalizedSentence = "YES SYSTEM IS ON.";
            }
            outToClient.writeBytes(capitalizedSentence);
         }
      }
}

TCP クライアント (Android エミュレーターで実行):

package a.b.c;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class WifitestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try
        {
            String sentence="IS COMPUTER ON?";
            String modifiedSentence=sentence;
            Socket clientSocket = new Socket("10.0.2.2", 9000);
            DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            outToServer.writeBytes(sentence);
            modifiedSentence = inFromServer.readLine();
            TextView a=(TextView)findViewById(R.id.textView1);
            a.setText(modifiedSentence);
            a.showContextMenu();
            clientSocket.close();
        }
        catch(Exception e)
        {
            TextView a=(TextView)findViewById(R.id.textView1);
            a.setText(e.toString());
            a.showContextMenu();
        }

    }
}
4

2 に答える 2

0

いくつかのヒント

  1. クライアントソケットを作成するには、次を使用します

    コンストラクターSocket(String host, int port)は、ホストへの最初の接続が確立されるまで無期限にブロックできます。

この問題は、まず接続されていないソケットを作成してから、タイムアウトを使用して接続することで解決できます。

Socket s = new Socket();
s.connect(new InetSocketAddress(host, port), timeout);
  1. PrintWriterサーバー側では、ソケットからの低レベルバイトと文字データの間のブリッジとして機能するため、 Only を使用します。

    例: サーバーのコード

    public class ServerTest {
    
    ServerSocket s;
    
    public void go() {
    
        try {
            s = new ServerSocket(44457);
    
            while (true) {
    
                Socket incoming = s.accept();
                Thread t = new Thread(new MyCon(incoming));
                t.start();
            }
        } catch (IOException e) {
    
            e.printStackTrace();
        }
    
    }
    
    class MyCon implements Runnable {
    
        Socket incoming;
    
        public MyCon(Socket incoming) {
    
            this.incoming = incoming;
        }
    
        @Override
        public void run() {
    
            try {
                PrintWriter pw = new PrintWriter(incoming.getOutputStream(),
                        true);
                InputStreamReader isr = new InputStreamReader(
                        incoming.getInputStream());
                BufferedReader br = new BufferedReader(isr);
                String inp = null;
    
                boolean isDone = true;
    
                System.out.println("TYPE : BYE");
                System.out.println();
                while (isDone && ((inp = br.readLine()) != null)) {
    
                    System.out.println(inp);
                    if (inp.trim().equals("BYE")) {
                        System.out
                                .println("THANKS FOR CONNECTING...Bye for now");
                        isDone = false;
                        s.close();
                    }
    
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                try {
                    s.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }
    
        }
    
    }
    
    public static void main(String[] args) {
    
        new ServerTest().go();
    
    }
    

    }

于 2012-06-10T09:55:25.417 に答える
0

エミュレータのネットワーク遅延オプションを確認できますか? また、多くのプロセスがマシン上で実行されていないことを確認してください。これらのプロセスは、エミュレータが消費すると予想される CPU サイクルを盗む可能性があるためです。

于 2012-06-10T08:51:59.303 に答える