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连接再说
 


 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.csdn.net/download/binbinxiaoz/10481505


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

 

 

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







 

  • 4
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Socket类是Java中负责处理客户端通信的类。它提供了发送接收数据的方法。在实现Socket发送数据的过程中,可以通过以下步骤来进行: 1. 创建一个Socket对象,指定服务器的IP地址和端口号。 2. 获取该Socket对象的输出流,通过该输出流向服务器发送数据。 3. 使用输出流的write方法将要发送数据写入缓冲区。 4. 调用输出流的flush方法,将缓冲区中的数据发送到服务器。 5. 关闭输出流。 在实现Socket接收数据的过程中,可以通过以下步骤来进行: 1. 创建一个Socket对象,指定服务器的IP地址和端口号。 2. 获取该Socket对象的输入流,通过该输入流从服务器接收数据。 3. 使用输入流的read方法读取服务器发送过来的数据。 4. 关闭输入流。 需要注意的是,发送接收数据的操作通常是在不同的线程中进行的,以避免阻塞。因此,在实际使用中,可以通过多线程的方式来实现Socket发送接收数据的功能。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [java使用Socket接收发送数据](https://download.csdn.net/download/weixin_38752074/12792212)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [模拟实现通过使用多个WiFi模块+串口助手进行数据发送,采用socket协议,接收数据进行解析](https://download.csdn.net/download/weixin_46549923/85705653)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值