1

私は、Wi-Fi接続を使用した基本的なチャットプログラムのようなテストプロジェクトに取り組んでいます。2つの異なるデバイスを接続するためのソケットを作成していますが、最初のメッセージを送信すると、他のデバイスに表示されるという問題があります。しかし、もう一度送信しようとすると、最初のログからメッセージが送信されたことがわかりますが、2番目のデバイスには表示されません。

受信したデータの読み取りを別のスレッドまたは非同期タスクで実装しようとしましたが、問題はまだあります。これが私の実装の両方の方法です:

シングルスレッド:

public void listenForSocket(){
    thread =  new Thread(new Runnable() {
        public void run() {
            Log.e("READDATAFROMSOCKET","READDATAFROMSOCKET");
            try {
                // sets the service running state to true so we can get it's state from other classes and functions.                     
                serverSocket = new ServerSocket(DNSUtils.port);
                client = serverSocket.accept();
                client.setKeepAlive(true);
                InputStream is = client.getInputStream();
                Log.d("","is Size : "+is.available());
                BufferedReader in = new BufferedReader(new InputStreamReader(is));
                int readed = in.read();
                Log.d("","readed bytes : "+readed);
                String line = "";
                while ((line = in.readLine()) != null) {
                    Log.i("","line : "+line);
                    changeText(line);
                }

                //client.close();
                //serverSocket.close();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });
    thread.start();
}

そしてここにAsyncTaskがあります:

class ServerTask extends AsyncTask<Void, Void, Void>{

    private String line = "";

    @Override
    protected Void doInBackground(Void... params) {
        try {
            Log.e("ASYNCTASK","ASYNCTASK");
            // sets the service running state to true so we can get it's state from other classes and functions.                     
            serverSocket = new ServerSocket(DNSUtils.port);
            client = serverSocket.accept();
            client.setKeepAlive(true);
            InputStream is = client.getInputStream();

            Log.d("","is Size : "+is.available());
            BufferedReader in = new BufferedReader(new InputStreamReader(is));
            int readed = in.read();
            Log.d("","readed bytes : "+readed);

            while ((line = in.readLine()) != null) {
                Log.i("","line : "+line);                   
            }

            //client.close();
            //serverSocket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        changeText(line);
    }
}

changeText(String); -

private void changeText(final String line) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            LinearLayout.LayoutParams params = new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            params.gravity = Gravity.RIGHT;
            TextView sendMsg = new TextView(MainActivity.this);
            sendMsg.setText(DNSUtils.clientName+" : "+line);
            sendMsg.setTextColor(Color.DKGRAY);
            sendMsg.setTextSize(18);
            layout.addView(sendMsg, params);
        }
    });
}

この問題を解決する方法はありますか?

また、受信したデータを読み取っているときに、送信した文字列の最初の文字が表示されないという問題もあります。常に2番目の文字から始まります。

前もって感謝します。

4

1 に答える 1

1

もし私があなたserverSocket = new ServerSocket(DNSUtils.port);だったら、new; で一度だけ実装しようとします。すべてのスレッドではありません。

于 2012-07-30T15:44:33.120 に答える