博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android编程 UDP客户端和TCP客户端
阅读量:3948 次
发布时间:2019-05-24

本文共 9272 字,大约阅读时间需要 30 分钟。

               

Android编程:UDP客户端和TCP客户端

本文博客链接:,作者:jdh,转载请注明.

环境:

主机:

开发环境:Android Studio 2.2 Preview 3

说明:

1.的IP和端口固定,分别编写UDP和TCP客户端。

2.Android中主线程不允许网络操作,所以用线程实现UDP和TCP的收发。

3.用JAVA内置的观察者模式处理接收数据,如果接收到数据,则通知观察者。

4.Socket_Audio.java为UDP客户端

5.Socket_Cmd.java为TCP客户端

源码:

Socket_Audio.java

package com.bazhangkeji.demo01;/** * @file Socket_Audio.java * @brief 语音端口类 * @author jdh * @date 2016/7/9 * @update 2016/7/10 */import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.InetSocketAddress;import java.net.UnknownHostException;import java.util.Observable;public class Socket_Audio extends Observable implements Runnable {    //常量    //服务器IP    private final String SERVER_IP = "115.28.86.171";    //语音端口    private final int SERVER_PORT_AUDIO = 12801;    //本地端口    private final int LOCAL_PORT_AUDIO = 12801;    //网络相关变量    //最大帧长    private static final int MAX_DATA_PACKET_LENGTH = 1024;    //接收数据缓存    private byte[] Buffer_Receive = new byte[MAX_DATA_PACKET_LENGTH];//    private StringBuilder Frame_Receive = new StringBuilder(MAX_DATA_PACKET_LENGTH);    //接收数据包    private DatagramPacket Packet_Receive;    //端口    private DatagramSocket Udp_Socket;    /**     * @brief 构造函数     */    public Socket_Audio()    {        try        {            //端口            Udp_Socket = new DatagramSocket(LOCAL_PORT_AUDIO);            //接收包            Packet_Receive = new DatagramPacket(Buffer_Receive, MAX_DATA_PACKET_LENGTH);        }        catch (Exception e)        {            e.printStackTrace();        }    }    /**     * @brief 发送数据     * @param data:需要发送的数据     * @param len:数据字节数据     */    public void send(byte[] data, int len)    {        Thread_Send thread_send = new Thread_Send(data, len);        new Thread(thread_send).start();    }    @Override    public void run() {        while (true)        {            try            {                //接收数据                Udp_Socket.receive(Packet_Receive);//                //打印接收数据//                System.out.println(new String(Buffer_Receive,0,Packet_Receive.getLength()));                //判断数据是否合法                InetSocketAddress address = (InetSocketAddress) Packet_Receive.getSocketAddress();                //判断是否是调度服务器的ip                if (!address.getHostName().equals(SERVER_IP))                {                    continue;                }                //判断是否是调度服务器的端口    if (address.getPort() != SERVER_PORT_AUDIO)                {                    continue;                }                //通知观察者                setChanged();                notifyObservers(Packet_Receive);            }            catch (Exception e)            {                e.printStackTrace();            }        }    }    /**     * @brief 发送线程     */    private class Thread_Send implements Runnable {        //发送数据缓存        private byte[] Buffer_Send = new byte[MAX_DATA_PACKET_LENGTH];        //发送数据包        private DatagramPacket Packet_Send;        /**         * @brief 构造函数         * @param data:需要发送的数据         * @param len:数据字节数据         */        public Thread_Send(byte[] data, int len) {            //发送包            Packet_Send = new DatagramPacket(Buffer_Send, MAX_DATA_PACKET_LENGTH);            Packet_Send.setData(data);            Packet_Send.setLength(len);        }        @Override        public void run() {            try {                Packet_Send.setPort(SERVER_PORT_AUDIO);                Packet_Send.setAddress(InetAddress.getByName(SERVER_IP));                Udp_Socket.send(Packet_Send);            } catch (UnknownHostException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }    }}

Socket_Cmd.java

package com.bazhangkeji.demo01;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.DatagramPacket;import java.net.InetSocketAddress;import java.net.Socket;import java.net.SocketAddress;import java.util.Observable;import java.util.Observer;/** * @file Socket_Cmd.java * @brief 信令端口类 * @author jdh * @date 2016/7/9 * @update 2016/7/10 */public class Socket_Cmd extends Observable implements Runnable {    //常量    //服务器IP    private final String SERVER_IP = "115.28.86.171";    //语音端口    private final int SERVER_PORT_CMD = 12800;    //本地端口    private final int LOCAL_PORT_CMD = 12800;    //网络相关变量    //最大帧长    private static final int MAX_DATA_PACKET_LENGTH = 1024;    //端口    Socket Tcp_Socket;    //输入流    InputStream Buffer_Receive_Stream;    //网络连接标志    private boolean Flag_Connect = false;    //接收数据缓存    private byte[] Buffer_Receive = new byte[MAX_DATA_PACKET_LENGTH];    //接收数据包    private DatagramPacket Packet_Receive;    /**     * @brief 构造函数     */    public Socket_Cmd() {        //接收包        Packet_Receive = new DatagramPacket(Buffer_Receive, MAX_DATA_PACKET_LENGTH);    }    /**     * @brief 发送数据     * @param data:需要发送的数据     * @param len:数据字节数据     */    public synchronized void send(final byte[] data, final int len) {        //判断是否连接服务器        if (!Flag_Connect) {            return;        }        //发送        Thread_Send thread_send = new Thread_Send(data, len);        new Thread(thread_send).start();    }    @Override    public void run() {        //连接服务器        //端口        try {            Tcp_Socket = new Socket(SERVER_IP, SERVER_PORT_CMD);            Buffer_Receive_Stream = Tcp_Socket.getInputStream();        } catch (IOException e) {            e.printStackTrace();        }        //开启监听线程        try        {            new Thread(new Runnable(){                @Override                public void run() {                    while (true) {                        //判断当前是否连接                        if (!Flag_Connect)                        {                            continue;                        }                        //监听                        try {                            if (Buffer_Receive_Stream.available() > 0)                            {                                Packet_Receive.setLength(Buffer_Receive_Stream.read(Packet_Receive.getData()));//                                System.out.println(new String(Packet_Receive.getData(),0,Packet_Receive.getLength()));                                //通知观察者                                setChanged();                                notifyObservers(Packet_Receive);                            }                        } catch (IOException e) {                            e.printStackTrace();                        }                    }                }            }).start();        }        catch (Exception e)        {            e.printStackTrace();        }        //检测连接状态        while (true) {            Flag_Connect = Tcp_Socket.isConnected();            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                e.printStackTrace();            }//            System.out.println("连接状态:" + Flag_Connect);            if (!Flag_Connect) {                SocketAddress address = new InetSocketAddress(SERVER_IP, SERVER_PORT_CMD);                try {                    Tcp_Socket.connect(address);                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }    /**     * @brief 发送线程     */    private class Thread_Send implements Runnable {        //输出流        OutputStream Buffer_Send;        //发送数据缓存        private byte[] Buf_Send = new byte[MAX_DATA_PACKET_LENGTH];        private int Len = 0;        /**         * @brief 构造函数         * @param data:需要发送的数据         * @param len:数据字节数据         */        public Thread_Send(byte[] data, int len) {            Len = len;            for (int i = 0;i < Len;i++) {                Buf_Send[i] = data[i];            }            //输出流            try {                Buffer_Send = Tcp_Socket.getOutputStream();            } catch (IOException e) {                e.printStackTrace();            }        }        @Override        public void run() {            try {                Buffer_Send.write(Buf_Send,0,Len);                Buffer_Send.flush();            } catch (IOException e) {                e.printStackTrace();            }        }    }}

发送示例代码:

Socket_Audio socket_audio = new Socket_Audio();        new Thread(socket_audio).start();//        String buf = "hello,i am jdh1";//        socket_audio.send(buf.getBytes(),buf.length());        for (int i = 0;i < 20;i++)        {            String buf1 = "UDP:I AM JDH" + i;            try {                Thread.sleep(1);            } catch (InterruptedException e) {                e.printStackTrace();            }            socket_audio.send(buf1.getBytes(),buf1.length());        }        Socket_Cmd socket_cmd = new Socket_Cmd();        new Thread(socket_cmd).start();        try {            Thread.sleep(2000);        } catch (InterruptedException e) {            e.printStackTrace();        }        for (int i = 0;i < 20;i++)        {            String buf1 = "TCP:I AM JDH" + i;            try {                Thread.sleep(1);            } catch (InterruptedException e) {                e.printStackTrace();            }            socket_cmd.send(buf1.getBytes(),buf1.length());        }

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!

你可能感兴趣的文章
Android的Gradle技巧 1.5添加Java库依赖关系
查看>>
Android的Gradle技巧 1.6使用Android Studio添加库依赖关系
查看>>
Android的Gradle技巧 1.7配置存储库
查看>>
android Collections 排序,
查看>>
Android的Gradle技巧 2.1设置项目属性
查看>>
Android的Gradle技巧 2.2将应用程序从Eclipse ADT移植到Android Studio
查看>>
Android的Gradle技巧 2.3从Eclipse移植应用程序ADT使用Eclipse
查看>>
昂山素季 Aung San Suu Kyi
查看>>
AI 人工智能第一课 从贝叶斯定理开始
查看>>
朴素贝叶斯python实现
查看>>
Logistic回归原理及公式推导
查看>>
并发性与并行性 并发性与并行性
查看>>
惰性求值,可组合和模块化的JavaScript
查看>>
How to Extend Django User Model 如何扩展Django用户模型
查看>>
两个行业的故事:编程语言与富裕国家和发展中国家之间的差异
查看>>
15个用于管理MySQL服务器mysqladmin命令
查看>>
服务器端I / O性能:Node,PHP,Java与Go
查看>>
多行文本编辑时,同一行编辑不同类型的字符时自动换行的问题
查看>>
如何使开机动画只播一次
查看>>
如何在平台上实现LED灯的效果?如信号灯,来短信/来电时LED动画闪烁
查看>>