Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Socket聊天编程_Java_Android_Multithreading_Sockets - Fatal编程技术网

Java Socket聊天编程

Java Socket聊天编程,java,android,multithreading,sockets,Java,Android,Multithreading,Sockets,我的程序在使用套接字时遇到问题。我做了两个线程接收和发送,在android中做了两个使用AsyncTask,在计算机中做了两个使用线程。我的问题是在android中,当停止接收线程时,发送线程工作正常并发送消息,但当我取消对接收的注释时,发送直到停止服务器才工作。 代码: 此代码只接收消息,但不允许我发送 public class Chat extends Activity { Socket socket; Button send; PrintStream ps;

我的程序在使用套接字时遇到问题。我做了两个线程接收和发送,在android中做了两个使用AsyncTask,在计算机中做了两个使用线程。我的问题是在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);
        }
    }
}
公共类聊天扩展活动{
插座;
按钮发送;
打印流ps;
扫描仪;
编辑短信;
文本视图查特菲尔德;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u chat);
socket=SocketWrapper.getSocket();
send=(按钮)findviewbyd(R.id.send);
message=(EditText)findViewById(R.id.message);
chatField=(TextView)findViewById(R.id.chatField);
试一试{
ps=新的打印流(socket.getOutputStream());
scanner=新扫描仪(socket.getInputStream());
}捕获(IOE异常){
e、 printStackTrace();
}
send.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
新建Send().execute();
}
});
新建Receive().execute();
}
私有类发送扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
ps.println(message.getText().toString());
出版进度();
返回null;
}
@凌驾
受保护的void onProgressUpdate(void…值){
append(“您:”+message.getText().toString()+“\n”);
message.setText(“”);
super.onProgressUpdate(值);
}
}
私有类接收扩展异步任务{
字符串str;
@凌驾
受保护的字符串doInBackground(字符串…参数){
while(scanner.hasNext()){
str=scanner.nextLine();
出版进度();
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(void…值){
append(“服务器:“+str+”\n”);
super.onProgressUpdate(值);
}
}
}
但是当我注释new Receive().execute()时;发送线程工作正常


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

如果您至少在Android v3.0上运行,那么一次只能运行一个异步任务。 取消注释时,由于Receive正在运行,因此不能在之后运行send

一种替代方法是使用线程(例如Receive)

请参阅中的详细信息