网络编程(中)

发布者:世界美景
发布于:2017-11-03 19:17

上一篇文章 网络编程(上)我们了解了 网络编程之三要素 和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相当于创建码头 指定端口号9999
		DatagramPacket 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协议 其实这些都是为了 即时通讯做铺垫  如果此文帮助到了你希望能给点个赞










   

声明:该文观点仅代表作者本人,转载请注明来自看雪