簡體   English   中英

套接字聊天編程

[英]Socket chat programming

我的程序在玩套接字時遇到問題。 我做了兩個線程的接收和發送,做了兩個使用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(); 發送線程工作正常。

沒有異常拋出。 我糊塗了。

如果您至少在Android v3.0上運行,則一次只能運行一個AsyncTask。 取消注釋時,由於正在運行接收,因此無法在之后運行發送。

一種替代方法是改用Thread(例如對於Receive)。

查看此問題的詳細信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM