1. 程式人生 > >Socket實現通訊,實時接收資料以及傳送資料

Socket實現通訊,實時接收資料以及傳送資料

公司要做一個視訊採集socket通訊的專案,第三方服務端已經提供好了服務,讓我們對接,但是目前ui還沒有,所以就暫時先自己寫個小demo測試一下資料連線。 


* 先看下佈局吧,很直觀。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="socket.hdsx.com.socketdemo.MainActivity">


    <EditText
        android:id="@+id/port"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="埠號"
        android:text="5500" />


    <Button
        android:id="@+id/btn_connect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/port"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp"
        android:text="建立連線!" />


    <Button
        android:id="@+id/btn_receiver"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_connect"
        android:layout_centerHorizontal="true"
        android:text="接收資料!" />


    <Button
        android:id="@+id/btn_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_receiver"
        android:layout_centerHorizontal="true"
        android:text="傳送資料!" />




    <Button
        android:id="@+id/btn_stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btn_send"
        android:layout_centerHorizontal="true"
        android:text="斷開連線!" />




    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:gravity="center"
        android:text=""
        android:textSize="16sp" />


</RelativeLayout>


```
就是自己手動輸入埠號,手動的ip沒有寫,第三方直接給的固定的。


* 容我先建立Socket連線再說
```
/*
            建立連線
             */
            case R.id.btn_connect:
                tv_content.setText("");


                String port = this.port.getText().toString();
                if (!"".equals(port)) {
                    intPort = Integer.parseInt(port);
                } else {
                    Toast.makeText(MainActivity.this, "輸入埠號", Toast.LENGTH_SHORT).show();
                    return;
                }


                mThreadPool.execute(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            /*
                            建立請求連線
                             */
                            socket = new Socket("192.168.43.151", intPort);
                            System.out.println(socket.isConnected());


                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    if (socket.isConnected()) {
                                        tv_content.setText("建立連線成功!" + intPort);
                                    } else {
                                        tv_content.setText("建立連線失敗!" + intPort);
                                    }
                                }
                            });
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
                break;




 private ExecutorService mThreadPool;//這就是個執行緒池管理
 mThreadPool = Executors.newCachedThreadPool();
```
* 通訊建立成功了, 讓我先發送個引數資料再說
```
 case R.id.btn_send:
                sendMessageToServer();
                break;


  /*
    傳送資料給服務端
     */
    private void sendMessageToServer() {
        long l = System.currentTimeMillis();
        final JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("msgType", "");
            jsonObject.put("msgValue", "");
            jsonObject.put("msgTime", l + "");


        } catch (Exception e) {
            e.printStackTrace();
        }


        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    os = socket.getOutputStream();
                    os.write((jsonObject.toString() + "/n").getBytes("utf-8"));
                    // 資料的結尾加上換行符才可讓伺服器端的readline()停止阻塞
                    os.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }
        }).start();
    }


```
引數就是上面的, 這都很直觀的說。


傳送訊息之後,接下來就是處理返回的資料。注意這返回的資料格式很多,自行選擇解析
* 處理返回的資料
```
      /*
                獲取資料
                 */
            case R.id.btn_receiver:
                tv_content.setText("");
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            is = socket.getInputStream();
//                            isr = new InputStreamReader(is);
//                            br = new BufferedReader(isr);


                            DataInputStream input = new DataInputStream(is);
                            byte[] b = new byte[1024];


                            int len = 0;
                            String response = "";
                            while (true) {
                                len = input.read(b);
                                response = new String(b, 0, len);
                                Log.e("datadadata", response);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }).start();


                break;
```
簡單豪爽的轉換成了string,我管你是什麼。哈哈


* 最後就是斷開連線
```
     case R.id.btn_stop:
                dissConnection();
                break;


 /*
    斷開 連線
     */
    private void dissConnection() {
        try {
            // 斷開 客戶端傳送到伺服器 的連線,即關閉輸出流物件OutputStream
            os.close();
            // 斷開 伺服器傳送到客戶端 的連線,即關閉輸入流讀取器物件BufferedReader
            br.close();


            // 最終關閉整個Socket連線
            socket.close();


            // 判斷客戶端和伺服器是否已經斷開連線
            System.out.println(socket.isConnected());


        } catch (IOException e) {
            e.printStackTrace();
        }
    }
```
資源demo地址 :https://download.csdn.net/download/binbinxiaoz/10481505


以上就是個簡單的小demo,如果你需要可以參考參考。有關你們專案上的需求還要自己去完善,包括建立失敗之後繼續進行連線,接收到的是個流進行視訊播放阿什麼的。