套接字聊天编程

时间:2015-06-28 18:06:56

标签: java android multithreading sockets

我的程序使用套接字时遇到问题。我创建了两个线程Receive和Send,两个在android中使用AsyncTask,两个在计算机中使用Thread。我的问题是在android中停止接收线程,发送线程工作正常并发送消息,但当我取消注释接收,发送不起作用,直到我停止服务器。 代码:

此代码仅接收消息,但不允许我发送

public class Chat extends Activity {

    Socket socket;
    Button send;
    PrintStream ps;
    Scanner scanner;
    EditText message;
    TextView chatField;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);

        socket = SocketWrapper.getSocket();

        send = (Button) findViewById(R.id.send);
        message = (EditText) findViewById(R.id.message);
        chatField = (TextView) findViewById(R.id.chatField);


        try {
            ps = new PrintStream(socket.getOutputStream());
            scanner = new Scanner(socket.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }

        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Send().execute();
            }
        });

        new Receive().execute();

    }

    private class Send extends AsyncTask<String,Void,String>{
        @Override
        protected String doInBackground(String... params) {
            ps.println(message.getText().toString());
            publishProgress();
            return null;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            chatField.append("You : "+message.getText().toString()+"\n");
            message.setText("");
            super.onProgressUpdate(values);
        }
    }

    private class Receive extends AsyncTask<String,Void,String>{

        String str;
        @Override
        protected String doInBackground(String... params) {
            while(scanner.hasNext()){
                str = scanner.nextLine();
                publishProgress();
            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            chatField.append("Server : "+str+"\n");
            super.onProgressUpdate(values);
        }
    }
}

但是当我评论新的Receive()。execute();发送线程工作正常。

没有异常抛出。我很困惑。

1 个答案:

答案 0 :(得分:0)

如果您至少在Android v3.0上运行,则一次只能运行一个AsyncTask。 取消注释时,由于接收正在运行,因此无法运行发送。

一种替代方法是使用线程代替(例如,用于接收)。

请参阅this question

中的详细信息