關於android 創建socket 連接的各種問題和解決: 創建子線程, 線程間通訊, 中文編碼, 發送和讀取

首先, 允許internt訪問權限:

<uses-permission android:name="android.permission.INTERNET" />

其次, socket不允許在mainactivity下創建, 所以必須起線程:

new Thread(new Runnable(){
    @Override
    public void run() {
     //中間的代碼
    }
}).start();

最後, 起線程後, 需要子線程對主線程進行通訊, 採用handler, 主程序接收消息方面, 網上參考的代碼太老, 可以運行, 但是有警告, 這個代碼沒有警告, 適應2019年的android studio.:

    private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(@NonNull Message msg) {
            switch (msg.what)
            {
                case -1:
                    Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
                    break;
                case 1:
                    Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
                    break;
            }
            return false;
        }
    });

handler發送端的代碼:

Message message;
message = handler.obtainMessage();//性能優化後
message.what=1;
message.obj = "需要發送的消息";
handler.sendMessage(message); //發送消息

socket部分, 可以用utf編碼傳送中文字符串, 發送並接收反饋消息, 然後斷開.

 try {
                    Socket s = new Socket();
                    SocketAddress socketaddress = new InetSocketAddress( "10.0.2.2", 7779);//申請鏈接
                    s.connect(socketaddress, 1000);
                    OutputStreamWriter osw=new OutputStreamWriter(os, StandardCharsets.UTF_8);
                    osw.write("你好, hello server! <end>");
                    osw.flush();
                    final int bufferSize = 1024;
                    final char[] buffer = new char[bufferSize];
                    final StringBuilder out = new StringBuilder();
                    InputStream inputStream = s.getInputStream();
                    Reader in = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
                    for (; ; ) {
                        int rsz = in.read(buffer, 0, buffer.length);
                        if (rsz < 0)
                            break;
                        out.append(buffer, 0, rsz);
                    }
                    s.close();
                    Message message;
                    message = handler.obtainMessage();//性能優化後
                    message.what=1;
                    message.obj = out.toString();
                    handler.sendMessage(message); //發送消息
                }
                catch (Exception ex)
                {
                    Message message;
                    message = handler.obtainMessage();//性能優化後
                    message.what=-1;
                    message.obj = "網絡連接失敗";
                    handler.sendMessage(message); //發送消息
                }
            }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章