Socket实现通信,实时接收数据以及发送数据

本文介绍了一个简单的Socket通信Demo实现过程,包括建立连接、发送及接收数据,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司要做一个视频采集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连接再说
 


 private ExecutorService mThreadPool;//线程池管理
 mThreadPool = Executors.newCachedThreadPool();


            /*
            建立连接
             */
            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;


二、通信建立成功了, 让我先发送个参数数据再说

```
 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.youkuaiyun.com/download/binbinxiaoz/10481505


以上就是个简单的小demo,如果你需要可以参考参考。有关你们项目上的需求还要自己去完善,包括建立失败之后继续进行连接,接收到的是个流进行视频播放阿什么的。

 

 

19年11月末浏览代码时发现,之前没有代码块,加了一下代码块。







 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值