Socket通信基础(二)

  接第一章介绍UDP通信。相较于TCP,UDP是非常轻量级的通信方式。主要运用于游戏、影视、娱乐等场合。这些场合的共同特征就是,对速度要求比较高,但是对正准备性要求,并不是很高。比如视频时,丢掉一个错误帧,并不会观影质量产生太大影响。

  这篇主要介绍Android端的UDP通信。

  假设接收的IP是192.168.0.50,监听端口是4444(如果是手机的IP可以在设置中的关于手机里面的手机状态里查看到IP信息)。  

  发送部分的代码为:

    static void sendStringByUDP(final String str, final String address, final int port) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    DatagramSocket socket = null;
                    //首先创建一个DatagramSocket对象
                    if(socket==null){
                        socket = new DatagramSocket(null);
                        socket.setReuseAddress(true);
                        socket.setBroadcast(true);
                        socket.bind(new InetSocketAddress(port));
                    }
                    //创建一个InetAddree
                    InetAddress serverAddress = InetAddress.getByName(address);
                    byte data[] = str.getBytes("utf-8");  //把传输内容分解成字节

                    //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个、地址,以及端口号
                    DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, port);

                    //调用socket对象的send方法,发送数据
                    socket.send(packet);
                    socket.close();
                } catch (Exception e) {

                    e.printStackTrace();

                }
            }
        }).start();
    }

  我们可以从上面的代码中发现,我们首先检查了,datagramsocket是否为空,如果不为空的话再新建连接。后面就是比较常规的获取byte[] ,然后构造数据包,发送数据包,关闭socket。

  接收部分代码:

    static void getStringByUDP(final int port, final OnReceiveDataListener listener) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                String dataStr = null;
                // 创建一个DatagramSocket对象,并指定监听的端口号
                DatagramSocket socket = null;
                try {
                    socket = new DatagramSocket(port);

                    // 创建一个byte数组用于接收
                    byte data[] = new byte[4 * 1024];

                    // 创建一个空的DatagramPackage对象
                    DatagramPacket packet = new DatagramPacket(data, data.length);

                    // 使用receive方法接收发送方所发送的数据,同时这也是一个阻塞的方法
                    socket.receive(packet);
                    // 得到发送过来的数据
                    dataStr = new String(packet.getData(), packet.getOffset(), packet.getLength());
                    if (listener != null) {
                        listener.onReceiveStringListener(dataStr);
                    }
                    socket.close();
                } catch (SocketException e) {

                    e.printStackTrace();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }
        }).start();
    }

    interface OnReceiveDataListener {
        void onReceiveStringListener(String dataStr);
    }

  与发送类似,建立连接,构建数据包,连接接收数据包,将接收到的数据通过监听传出。

  看起来与前面的TCP很类似,但是在调试过程中遇到了两个坑:

  1?

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

  部分rom手机需要这么多权限才行!我也不知道为啥。。。

  2?

  如果想让这个app既接收数据,也发送数据,UDP,接收和发送的port口不能用一样的,不然会报被占用的错误。

Done

时间: 2024-10-22 18:45:52

Socket通信基础(二)的相关文章

C# Socket基础(二) 之 服务器异步接收消息

ManualResetEvent reviceManager = new ManualResetEvent(false); 1 public void args_Completed(object sender, SocketAsyncEventArgs e) 2 { 3 //监听完成客户端的请求,一但监听到返回新的套接字 4 var clientSocket = e.AcceptSocket; 5 //启动线程获取客户端发来的消息 6 if (clientSocket == null) retu

一起talk C栗子吧(第一百四十八回:C语言实例--socket通信二)

各位看官们,大家好,上一回中咱们说的是socket通信的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中介绍了套接字的通信步骤,限于时间的原因, 我们只介绍了流套接字的通信步骤.这一回中我们将介绍数据报套接字的通信步骤. 下面是客户端和服务器端实现通信的详细步骤: 客户端实现通信的步骤: 1.创建客户端套接字(socket): 2.设置客户端套接字的属性:域,类型和协议: 3.通过操作客户端套接字来实现客户端与服务器的通信(sendto,r

10 Socket(二)

1. 作用域 1.1 作用域 代码1 if 1 == 1: name = 'alex' for i in range(10): name = i print(name) # Java/C# 不可以 # Python/JavaScript 可以 # Python中无块级作用域 代码2:函数 def func(): name = 'alex' print(name) def func(): name = 'alex' func() print(name) # Python中以函数为作用域 代码3:

C#应用视频教程1.1 Socket通信基础

做Socket通信之前,我们首先要实现几个基本的功能 获取本机IP地址(如果我们要做Socket的服务器,肯定不希望用户每次填写本机IP地址,而是自动获取本机IP地址,这一点我们最好能做的比已有的软件更合理,更好用),下面的方法简单实现了获取本机IP地址,后面一个方法还把IPV6的地址也得到了,但是目前还没有什么用处(可能以后用得到) ? 能PING通一个远程的IP地址(如果我们要做Socket的客户端,最好在连接之前能知道目标IP能不能连接上,如果不能PING通,则直接告诉用户网络连接有问题就

一起talk C栗子吧( 第一百五十回:C语言实例--socket通信接口二)

各位看官们,大家好,上一回中咱们说的是socket通信的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中介绍了套接字通信过程中使用的系统调用,这些系统调用具有通用性,在任何类型的套接字通信过程中都可以使用它们.今天,我们将介绍一些专门用来通过套接字发送和接收数据的系统调用.这些系统调用的功能十分相似,只是在操作的细节上不相同.接下来我们分别介绍他们. 发送数据的系统调用 ssize_t send(int sockfd, const void

java通信之Socket通信基础

正处于网络环境下的两个程序,它们之间通过一个交互的连接来实现数据通信.每一个连接的通信端叫做一个Socket.一个完整的Socket通信程序应该包含以下几个步骤: ①创建Socket: ②打开连接到Socket的输入输出流: ④按照一定的协议对Socket进行读写操作: ④关闭Socket. Socket通信分两部分:服务器端和客户端.服务器端必须优先启动,然后等待socket连接,如果达成连接则开始执行输入输出操作,通过输入流获取客户端的请求信息,通过 输出流返回客户端信息.客户端则只需创建一

Java之------socket系列(二)UDP

☆ UDP: 将数据及源和目的封装成数据包中,不需要建立连接 每个数据报的大小在限制在64k内 因无连接,是不可靠协议 不需要建立连接,速度快 DatagramSocket和 DatagramPacket类 UDP传输: DatagramSocket与DatagramPacket 建立发送端,接收端. 建立数据包. 调用Socket的发送接收方法. 关闭Socket. 发送端与接收端是两个独立的运行程序. UDP传输编程: ☆发送端 在发送端,要在数据包对象中明确目的地IP及端口. Datagr

socket网络(二)

作用域 python/js语言中,无块级作用域 if 1 == 1: name = 'alex' print(name) python中以函数为作用域 def func(): name = 'alex' print(name) 作用域链, name = 'alex' def f1(): print(name) def f2(): name = 'Eric' f1() f2()

Python 基础之socket编程(二)

Python 基础之socket编程(二) 昨天只是对socket编程做了简单的介绍,只是把socket通信的框架搭建起来,要对其中的功能进行进一步的扩充,就来看看今天的料哈! 一.基于tcp的套接字 1. tcp的服务端 ss = socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字 ss.listen() #监听链接 inf_loop: #服务器无限循环 cs = ss.accept() #接受客户端链接 comm_loop: #通讯循环 cs.recv()/cs.