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