java之 23天 UDP 网络编程 (一)

网络编程


import java.net.InetAddress;
import java.net.UnknownHostException;


/**
 * 网络编程
 * 网络模型
 *   OSI 模型
 *   TCP/IP模型
 * 网络通讯要素
 *   IP地址
 *   端口号 
 *   传输协议:通讯协议
 *   
 * ------------------------------------- 
 *  OSI参考模型 		TCP/IP参考模型
 *  应用层			[
 *  表示层				应用层 (http /ftp /smtp)
 *  会话层			]
 *  
 *  传输层			传输层  (TCP协议)
 *  网络层			网际层  (IP协议)
 *  
 *  数据链路层			[
 *  物理层			主机至网络层]
 * ----------------------------------------------- 
 * 
 * IP地址:InetAddress
 *		网络中设备的标识
 * 		不易记忆,可用主机名
 *      本地回环地址:127.0.0.1 主机名:localhost
 * 端口号
 *		用户标识进程的逻辑地址.不同进程的标识
 *      有效端口 0~65535,其中0-1024端口系统使用或保留端口.
 * 传输协议
 *      通信的规则
 *      常见的协议:TCP  UDP
 *
 *
 * UDP:(无连接,不可靠,有限制,速度快.) 网络视频会议,宁波,聊天,桌面共享
 *     将数据及源和目的封装成数据包中,不需要建立连接
 *     每个数据包的大小限制在64k内
 *     因无连接,是不可靠协议
 *     不需要建立连接,速度快.
 *     
 * TCP: (有连接,很可靠,没限制,速度慢.) 文件下载.
 *	   建立连接,形成传输数据通道.
 *   在连接的中进行大量数传递
 *   通过三次握手完成连接.是可靠协议(三次握手:  在吗?(A) -------->在的(B)---------> 知道你在了(A)---------->B(知道了) )
 *   必须建立连接,效率稍低.
 *   
 * Socket:(插座的意思) socket370 
 *   Socket:就是为网络服务提供的一种机制.
 *   通信的两端都有Socket.
 *   网络通信其实就是Socket间的通信
 *   数据在两个Socket间通过IO传输
 *   
 * 每个协议都有不同Socket对象
 * 
 */


public class NetDemo {

	public static void main(String[] args) throws UnknownHostException {
		InetAddress i=InetAddress.getLocalHost();
		System.out.println(i.toString());
		System.out.println("address:"+i.getHostAddress());
		System.out.println("name:"+i.getHostName());
		
		System.out.println("根据主机名获取 InetAddress");
		
		/*InetAddress ia=InetAddress.getByName("192.168.1.168");
		System.out.println("address:"+ia.getHostAddress());
		System.out.println("name:"+ia.getHostName());*/

		System.out.println("根据主机名获取 InetAddress");
	/*	
		InetAddress ib=InetAddress.getByName("www.baidu.com");
		System.out.println("address:"+ib.getHostAddress());
		System.out.println("name:"+ib.getHostName());*/
		
		InetAddress[] ids=InetAddress.getAllByName("www.baidu.com");
		for (InetAddress inetAddress : ids) {
			System.out.println(inetAddress);
		}

	}

}



UDP的传输


//客户端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


/**
 * 需求:通过udp传输方式,将一段文字数据发送出去
 * 思路:
 *  1)建立updsocket服务
 *  2)提供数据,并将数据封装到数据包中
 *  3)通过socket服务的发送功能,将数据包发送出去.
 *  4)关闭资源
 */
public class UdpSend {
	public static void main(String[] args) throws IOException {
		
		//创建udp服务,通过DatagramSocket对象
		DatagramSocket ds=new DatagramSocket(8888);  //可以指定端口发送 ,否则 系统随机发送
		
		
		//2,确定数据,并封装成数据包
			byte[] buf="udp ge men lai le".getBytes();
			DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.121"),10000);
			
			//3.通过Socket服务,将已有的数据包,发送出去,通过send方法
			ds.send(dp);
		
		//4.关闭资源
		ds.close();
		
	}

}

//服务端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
 * 需求:
 * 定义一个应用程序,用于接受udp协议传输的数据并处理
 * 思路:
 *   1)定义udpSocket服务:通常会监听一个端口,其实就是给这个接受网络应用程序定义的数字标识.
 *   2)定义一个数据包,因为 要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息
 *   3)通过Socket服务端额receive方法将收到的数据存入一定义好的数据包中.
 *   4)通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
 *   5)关闭资源
 */
public class UdpReceive {

	public static void main(String[] args) throws IOException {
		//1.建立udp socket 建立端点.
		DatagramSocket ds=new DatagramSocket(10000);   //服务建立一次就可以了
		while(true){
			//2.定义数据包,用于存储数据.
			byte[] buf=new byte[1024];
			DatagramPacket dp=new DatagramPacket(buf, buf.length);
			
			//3.通过服务的receive方法将接收到的数据存入到数据包中
			ds.receive(dp);  //接受数据到数据包中,阻塞式方法.
			
			//4.通过数据包的方法 获取其中的数据.
			String ip=dp.getAddress().getHostAddress();
			String data=new String(dp.getData(),0,dp.getLength());
			int port=dp.getPort();
			System.out.println(ip+"::"+data+"::"+port);
		}
		//ds.close();
	}

}



UDP 键盘循环录入发送给服务端


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UdpSend2 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		DatagramSocket ds=new DatagramSocket();
		
		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
		
		String line=null;
		while((line=bufr.readLine())!=null){
			if("886".equals(line))
				break;
			byte[] buf=line.getBytes();
			//255 是发广播 所有能够接受的 都能监听到.
			//192.168.1.0: 网络段
			//192.168.1.255: 广播地址
			DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.1.255"),10000);
			ds.send(dp);
		}
		ds.close();
		
	}
}

class UdpRece2{
	public static void main(String[] args) throws IOException{
		DatagramSocket ds=new DatagramSocket(10000);
		
		while(true){
			byte[] buf=new byte[1024*64]; //不会大于 64k 的
			DatagramPacket dp=new DatagramPacket(buf, buf.length);
			ds.receive(dp);
			String ip=dp.getAddress().getHostAddress();
			String data=new String(dp.getData(),0,dp.getLength());
			System.out.println(ip+"::"+data);
			
		}
		
	}
	
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答这个问题。UDP是一个无连接的协议,它不保证数据包的可靠传输,也不保证数据包的顺序。因此,在使用UDP进行网络通信时,需要注意以下几点: 1. UDP数据包的大小是有限制的,一般情况下不能超过64K。 2. 接收UDP数据包时,需要使用一个固定大小的缓冲区,来存储接收到的数据。如果数据包的大小超过了缓冲区的大小,那么多余的数据将被丢弃。 3. 接收UDP数据包时,需要使用一个循环来不断地接收数据,直到接收到完整的数据包为止。 下面是一个简单的Java UDP接收程序的示例代码: ```java import java.net.*; public class UDPReceiver { public static void main(String[] args) { try { DatagramSocket socket = new DatagramSocket(9999); byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, buffer.length); while (true) { socket.receive(packet); String message = new String(packet.getData(), 0, packet.getLength()); System.out.println("Received message: " + message); } } catch (Exception e) { e.printStackTrace(); } } } ``` 在这个示例程序中,我们创建了一个DatagramSocket对象,并绑定到了本地的9999端口。然后我们创建了一个缓冲区,用来存储接收到的数据。接着,我们创建了一个DatagramPacket对象,用来接收数据。在循环中,我们使用socket.receive()方法来接收数据包,并将数据存储在packet对象中。最后,我们将接收到的数据转换成字符串,并输出到控制台上。 希望这个示例程序可以帮助你理解UDP网络通信的基本原理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值