Java-学习网络编程总结上

网络编程

1. 网络编程三要素

  • 协议:
     要求传递数据的双方计算机都必须遵守的,按照对应的网络传输协议才可以进行数据的交互和运算。目前网络段传输比较常见的协议:UDP,TCP/IP。
  • IP地址:
     Internet Protocol Address ,当前计算机在网络中的一个地址编号,类似于手机号码。
     IPV4协议:是一个32位的二进制数,例如192.168.1.1,各代表0~255的数字,截止到目前,已经消耗殆尽。
     IPV6协议:8组16字节(128位)的地址长度,0x0~0xFFFF。
  • 端口号:
     端口号是当前应用程序在计算机中的一个编号,可以让计算机明确知道当前的数据是给予哪一个程序来使用,或者数据是从哪一个程序出现的,端口号是一个short类型,065535,但01024是特定的系统端口号,不能用于自定义。

2. IP类

  • IP类是SUN公司提供给开发使用的IP地址类,InetAddress。
  • 使用到的方法:
     public static InetAddress getLocalHost( ):获取本机IP地址类对象,通过类名直接调用。
     public static InetAddress getByName(String name):根据指定的主机名,域名或者IP地址,获取对应的IP地址类对象。
     public static InetAddress[ ] getAllByName(String name):获取指定主机名或者域名对应的所有IP地址类对象。
/*
 * IP地址类演示
 */
public class Demo1 {
	public static void main(String[] args) throws IOException {
		//获取本机IP地址类对象
		InetAddress localHost = InetAddress.getLocalHost();
		System.out.println(localHost);
		
		//根据本机名得到IP地址类对象
		InetAddress byName = InetAddress.getByName("DESKTOP-6EJIUVL");
		System.out.println(byName);
		
		//根据域名得到IP地址类对象
		InetAddress byName2 = InetAddress.getByName("www.4399.com");
		System.out.println(byName2);
		
		//根据指定的主机名,或者域名,获取对应的IP地址类对象数组
		InetAddress[] allByName = InetAddress.getAllByName("www.baidu.com");
		for (InetAddress inetAddress : allByName) {
			System.out.println(inetAddress);
		}
	}
}

3. UDP协议

3.1 UDP协议特点:

  1. 面向无连接,数据传递不算特别安全。
  2. 因为面向无连接,所以传输速度快。
  3. 因为面向无连接,所以存在丢包的问题。
  4. UDP没有客户端和服务器之分,都可以作为发送端和接受端。
  5. 使用场景:直播,网络游戏。

3.2 UDP协议传输:

  • UDP数据传输方式:UDP协议数据传递采用数据包方式传递,所有的数据要进行打包操作,并且没有对应的客户端服务器概念,有且只有发送端和接受端。
3.2.1 发送端
  • 步骤:
  1. 获得一个发送端UDP协议的套接字DatagramSocket。
//1.得到一个发送端UDP的Socket
DatagramSocket datagramSocket = new DatagramSocket();
  1. 将要发送的数据打包。
     public DatagramPocket(byte[ ] buf,int length,InetAddress address,int port);
      发送端将数据打包成一个DatagramPocket对象,buf表示要发送的数据的字节数组,length表示当前字节数组中的数据容量字节数,address表示接受端的IP地址类对象,port表示接收端程序对应的端口号。
//2.将要传输的数据打包
byte[] buf = "你是个嘛呀".getBytes();
DatagramPacket packet = new DatagramPacket(
buf, buf.length, InetAddress.getLocalHost(), 4399);
  1. 通过套接字调用方法发送数据包。
     public void send(DatagramPocket pocket);
      通过将DatagramPocket数据包对象作为参数,通过DatagramSocket对象调用,发送数据。
//3.发送数据包
datagramSocket.send(packet);
  1. 关闭套接字对象。
//4.关闭
datagramSocket.close();
/*
 * UDP发送端
 */
public class SenderDemo {
	public static void main(String[] args) throws IOException {
		System.out.println("发送端启动");
		//1.得到一个发送端UDP的Socket
		DatagramSocket datagramSocket = new DatagramSocket();
		
		//2.将要传输的数据打包
		byte[] buf = "你是个嘛呀".getBytes();
		DatagramPacket packet = new DatagramPacket(
			buf, buf.length, InetAddress.getLocalHost(), 4399);
		
		//3.发送数据包
		datagramSocket.send(packet);
		
		//4.关闭
		datagramSocket.close();
	}
}
3.2.2 接收端
  • 步骤:
  1. 获得一个接收端UDP协议的套接字DatagramSocket,并且监听端口port。
//1.得到一个监听发送端端口的Socket
DatagramSocket datagramSocket = new DatagramSocket(2425);
  1. 准备一个空数据包,用来接收发送端发送的数据。
     public DatagramPocket(byte[ ] buf,int length);
      准备一个空的数据包,用来接收发送端发送的数据,buf表示空的字节数组用来接收数据,length表示当前缓冲数组的容量。
//2.准备一个空的数据包,用来接受发送端发送的数据
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
  1. 通过套接字调用方法接收发送端发送的数据包。
     receive(DatagramPocket pocket);
      通过DatagramSocket对象调用,将空的数据包作为参数,接收发送端发送的数据。
//3.接受数据
datagramSocket.receive(packet);
  1. 关闭套接字对象。
//4.关闭
datagramSocket.close();
/*
 * UDP接收端
 */
public class ReceiveDemo {
	public static void main(String[] args) throws IOException {
		System.out.println("接收端启动");
		//1.得到一个监听发送端端口的Socket
		DatagramSocket datagramSocket = new DatagramSocket(2425);
		
		//2.准备一个空的数据包,用来接受发送端发送的数据
		byte[] buf = new byte[1024];
		DatagramPacket packet = new DatagramPacket(buf, buf.length);
		
		//3.接受数据
		datagramSocket.receive(packet);
		
		System.out.println(new String(buf,0,packet.getLength()));
		
		//4.关闭
		datagramSocket.close();
	}
}
发布了18 篇原创文章 · 获赞 21 · 访问量 8644

猜你喜欢

转载自blog.csdn.net/cccccv_/article/details/104739633