【问题标题】:Android AsyncTask send/read data using SocketAndroid AsyncTask 使用 Socket 发送/读取数据
【发布时间】:2012-07-31 05:10:45
【问题描述】:

我正在做一个测试项目,比如一个使用 wi-fi 连接的基本聊天程序。 我正在创建套接字来连接两个不同的设备,但我的问题是当我发送第一条消息时,它显示在另一个设备中。但如果我再次尝试发送,我可以在第一个日志中看到消息已发送,但它从未出现在第二个设备中。

我尝试在另一个线程中实现读取接收到的数据..或在异步任务中,但问题仍然存在。以下是我的两种实现方式:

单线程:

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);
    }
}

更改文本(字符串); -

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);
        }
    });
}

有什么办法可以解决这个问题吗?

另一个问题是,当我读取接收到的数据时,发送的字符串的第一个字母从不显示。它总是从第二个字母开始。

提前致谢。

【问题讨论】:

  • 我认为后台服务更符合您的需求。只要您的Activity 绑定到它,它就会一直存在。完成代码后它不会完成,例如您的 Threads 或 AsyncTasks

标签: android sockets android-asynctask


【解决方案1】:

如果我是你,我会尝试只用 new 实现一次serverSocket = new ServerSocket(DNSUtils.port);;不是在每个线程中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多