2

Android をコンピューターと通信させようとしていますが、ほぼ完了しています。インターネット経由で自分のコンピューターなどに文字列を送信することはできますが、1 つだけ問題があります。コンピューターが文字列を読み取ると、文字列が null になるのです。

クライアントのコードは次のとおりです。

public class ClientActivity extends Activity implements View.OnClickListener{

EditText ip1,ip2,ip3,ip4, message, port;
TextView con;
Button send;
InetAddress inet;
Socket s;
OutputStream out;
PrintWriter output;
int sip;
int rport;
byte[] ip;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ip1 = (EditText) findViewById(R.id.etIP1);
    ip2 = (EditText) findViewById(R.id.etIP2);
    ip3 = (EditText) findViewById(R.id.etIP3);
    ip4 = (EditText) findViewById(R.id.etIP4);
    port = (EditText) findViewById(R.id.etPort);
    message = (EditText) findViewById(R.id.etMessage);
    send = (Button) findViewById(R.id.bSend);
    con = (TextView) findViewById(R.id.tvCon);
    ip = new byte[4];

    send.setOnClickListener(this);    }

@Override
public void onClick(View arg0) {
    switch(arg0.getId()){
        case R.id.bSend:

        try{
            rport = Integer.parseInt(port.getText().toString());
        } catch (NumberFormatException e){
            con.setText(e.toString());
            break;
        }

        try{
            sip = Integer.parseInt(ip4.getText().toString());
            sip = (sip << 8) + Integer.parseInt(ip3.getText().toString());
            sip = (sip << 8) + Integer.parseInt(ip2.getText().toString());
            sip = (sip << 8) + Integer.parseInt(ip1.getText().toString());
        } catch (NumberFormatException e){
            con.setText(e.toString());
            break;
        }

        ip[0] = (byte)(0xff & sip);
        ip[1] = (byte)(0xff & (sip >> 8));
        ip[2] = (byte)(0xff & (sip >> 16));
        ip[3] = (byte)(0xff & (sip >> 24));

        try {
            inet = InetAddress.getByAddress(ip);
            s = new Socket(inet, rport);
            out = s.getOutputStream();
            output = new PrintWriter(out);
            output.println(message.getText().toString());
            con.setText("Message Sent");
            s.close();
        } catch (UnknownHostException e) {
            con.setText(e.toString());
        } catch (IOException e) {
            con.setText(e.toString());
        }
        break;
    }
}
}

サーバーのコードは次のとおりです。

public class Main {
public static void main(String[] args) {
    try {
        Boolean end = false;
        ServerSocket ss = new ServerSocket(4331);
        while(!end){
                //Server is waiting for client here, if needed
                Socket s = ss.accept();
                BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
                PrintWriter output = new PrintWriter(s.getOutputStream(),true); //Autoflush
                String st = input.readLine();
                System.out.println(""+st);
                s.close();     
         }
         ss.close();

        } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
    }
}

どんな助けでも大歓迎です。

編集:問題が見つかりました。もともと私は自分のコードをテストするためにエミュレータを使用していませんでした.エミュレータでwifiを動作させることができなかったので(簡単な修正でした)、エミュレータでコードを実行すると動作します.空文字列; しかし、実際のAndroidで実行するとnullが返されます。これが発生する原因と考えられる理由は1つだけです。使用しているSDKがAndroidのOSバージョン(古い)と一致しません。私が間違っている?

編集:私はそれを手に入れました.androids sdkマネージャーからapi 10パッケージのいくつかをインストールする必要があったことがわかりました.今では魅力のように機能します:)

4

1 に答える 1

0

null 文字列は、クライアントでのreadline呼び出しに続いて、入力ストリームが終了したことを通知するための単なる方法です。close

あなたのコードは基本的に動作するはずです。ロギングを追加し、Nagle アルゴリズムを無効にしてsetTcpNoDelay、接続する前にクライアント ソケットで呼び出すことにより、より高速 (より簡単) なデバッグを行います。

于 2012-06-26T21:46:58.177 に答える