网络编程(中)

来源:互联网 发布:伊修巴尔歼灭战 知乎 编辑:程序博客网 时间:2024/06/06 20:46

上一篇文章 网络编程(上)我们了解了 网络编程之三要素 和Socket  通讯原理 此篇文章我们将学习 UDP传输与优化 

没看过的朋友最好看下 网络编程(上) 加深理解 毕竟基础知识回忆一下也是好的 在看此文也能更加透彻的理解

网络编程  (UDP传输)

 1.发送Send
* 创建DatagramSocket, 随机端口号
* 创建DatagramPacket, 指定数据, 长度, 地址, 端口
* 使用DatagramSocket发送DatagramPacket
* 关闭DatagramSocket

eclipse 写两个main方法  我用的 Aandroid Studio 

/** * * 1.发送Send * 创建DatagramSocket, 随机端口号 * 创建DatagramPacket, 指定数据, 长度, 地址, 端口 * 使用DatagramSocket发送DatagramPacket * 关闭DatagramSocket */public static void main(String[] args) throws Exception {String str = "你好世界";DatagramSocket socket = new DatagramSocket();//创建Socket相当于创建码头DatagramPacket packet = //创建Packet相当于集装箱(数据)new DatagramPacket(str.getBytes(), str.getBytes().length,         InetAddress.getByName("127.0.0.1"), 9999);socket.send(packet);//发货,将数据发出去socket.close();//关闭码头 底层实现IO流 所以必须要关闭}

2.接收Receive
* 创建DatagramSocket, 指定端口号
* 创建DatagramPacket, 指定数组, 长度
* 使用DatagramSocket接收DatagramPacket
* 关闭DatagramSocket
* 从DatagramPacket中获取数据
* 3.接收方获取ip和端口号
* String ip = packet.getAddress().getHostAddress();
* int port = packet.getPort();

/** ** 2.接收  * 创建DatagramSocket, 指定端口号 * 创建DatagramPacket, 指定数组, 长度 * 使用DatagramSocket接收DatagramPacket * 关闭DatagramSocket * 从DatagramPacket中获取数据 */public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(9999);//创建Socket相当于创建码头 指定端口号9999DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱socket.receive(packet);//接货,接收数据byte[] arr = packet.getData();//获取全部的数据  有些为空int len = packet.getLength();//获取有效的字节个数System.out.println(new String(arr,0,len));  // 打印 接收到的数据socket.close();  // 关流}



注意启动的时候要 先启动服务端 在启动发送端


网络编程(UDP 传输优化)

上面的代码看起有点简陋 要一句一句发送 我们来做个优化 以键盘录入的形式


发送端

/** * * 1.发送Send * 创建DatagramSocket, 随机端口号 * 创建DatagramPacket, 指定数据, 长度, 地址, 端口 * 使用DatagramSocket发送DatagramPacket * 关闭DatagramSocket */public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);//创建键盘录入对象DatagramSocket socket = new DatagramSocket();//创建Socket相当于创建码头while(true) {String line = sc.nextLine();//获取键盘录入的字符串if("quit".equals(line)) {break;}DatagramPacket packet = //创建Packet相当于集装箱new DatagramPacket(line.getBytes(), line.getBytes().length,             InetAddress.getByName("127.0.0.1"), 9999);socket.send(packet);   //发货,将数据(数据)发出去}socket.close();//关闭码头}

接收端


接收端/** ** 2.接收Receive * 创建DatagramSocket, 指定端口号 * 创建DatagramPacket, 指定数组, 长度 * 使用DatagramSocket接收DatagramPacket * 关闭DatagramSocket * 从DatagramPacket中获取数据 */public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket(9999);//创建Socket相当于创建码头DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱while(true) {socket.receive(packet);//接货,接收数据byte[] arr = packet.getData();//获取数据int len = packet.getLength();//获取有效的字节个数String ip = packet.getAddress().getHostAddress();//获取ip地址int port = packet.getPort();//获取端口号System.out.println(ip + ":" + port + ":" + new String(arr,0,len)); //为了看起来明显点 加上ip地址和端口号}}


发送信息



接收到的数据




看起来是不是还不错  可以一直做发送操作 但必须开两个窗口 很麻烦 我们接着使用多线程来做优化



网络编程(UDP传输 多线程优化)


接受与发送在同一个窗口完成

 /**     * @param args     */    public static void main(String[] args) throws InterruptedException {        new Receive().start();        // 可以做个睡眠操作 如果你怕 发送先开启的话        new Send().start();    }}class Receive extends Thread {    public void run() {        try {            DatagramSocket socket = new DatagramSocket(9999);//创建Socket相当于创建码头            DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱            while(true) {                socket.receive(packet);//接货,接收数据                byte[] arr = packet.getData();//获取数据                int len = packet.getLength();//获取有效的字节个数                String ip = packet.getAddress().getHostAddress();//获取ip地址                int port = packet.getPort();//获取端口号                System.out.println(ip + ":" + port + ":" + new String(arr,0,len));            }        } catch (IOException e) {            e.printStackTrace();        }    }}class Send extends Thread {    public void run() {        try {            Scanner sc = new Scanner(System.in);//创建键盘录入对象            DatagramSocket socket = new DatagramSocket();//创建Socket相当于创建码头            while(true) {                String line = sc.nextLine();//获取键盘录入的字符串                if("quit".equals(line)) {                    break;                }                DatagramPacket packet = //创建Packet相当于集装箱                        new DatagramPacket(line.getBytes(), line.getBytes().length,                     InetAddress.getByName("127.0.0.1"), 9999);                socket.send(packet);//发货,将数据发出去            }            socket.close();        }  catch (IOException e) {            e.printStackTrace();        }    }

这下不是美滋滋 就在一个窗口完成了所有操作



这就是UDP 的核心逻辑了 其实还可以写GUI(图像化界面)加上 聊天记录 清屏 震动等功能 但一点用也没有 没有价值  学习到了核心逻辑就行了  过几天我会写 TCP协议 其实这些都是为了 即时通讯做铺垫  如果此文帮助到了你希望能给点个赞


                                             
2 0
原创粉丝点击