黑马基础 23 网络编程(UDP)

本文介绍了Java中的网络编程,重点讲解了网络通信的三要素——IP、端口和协议,特别是UDP协议。详细阐述了InetAddress、DatagramSocket和DatagramPacket类的使用,并提供了UDP发送端和接收端的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络编程:

定义:编程程序实现不同设备之间的信息的交互;(基本都在java.net包下)

1. 网络通信三要素(IP,端口,协议 )

  1. ip(设备的编号,为了方便找到这台设备)

    ipv4在2011年就宣告没有了, 从此出现ipv6
    Inetaddress类;表示互联网协议地址(ip)
    
  2. 端口(port):程序的编号(为了方便找到这个程序)

    (0- 65535) (0-1024) (1024 -- 65535)
    
    腾讯的QQ 4000:
    
  3. 协议:程序交流的规范(UDP TCP)

    udp:面向无连接,数据不可靠, 传输效率高
    
    Tcp:面向连接, 数据可靠,传输效率低 , (需要三次握手: 为什么? 要确保双方信道都是畅通的)
    

2. 相关类

InetAddress 类:是专门用来封装我们的ip;
127.0.0.1 代表本地ip地址在这里插入图片描述

DatagramSocket类:此类表示未发送和接收数据包的套接字。基于UDP协议;DatagramSocket类的作用就类似于码头

构造方法:

DatagramSocket();创建Socket对象并随机分配端口号,一般用于不需要指定端口的发送端
DatagramSocket( int port); 创建Socket对象并指定端口号,一般用于接收端

方法:
在这里插入图片描述

Datagrampack类:该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据。
构造方法:

接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端IP地址和端口号。

在这里插入图片描述
在这里插入图片描述

3.代码

UDP发送端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import javax.imageio.IIOException;
public class Send   {
 public static void main(String args[]) throws IOException{
	//创建socket对象
  	DatagramSocket dt=new DatagramSocket();
  	//打包
  	/*
   	* 
   	* DatagramPacket(byte[] buf, int length, InetAddress address,int port) 
   	* 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
   	* 数据 byte[] buf
   	* 数据长度 int length
   	* 接收ip地址  InetAddress address
   	* 接收端口 int port
   	*/
  	//接收端的设备(ip),
  	//InetAddress address=InetAddress.getLocalHost();//getLocalHost()是获取本地IP
  	InetAddress address=InetAddress.getByName("DESKTOP3DTIOB8");//getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。 
 	String s="java.hello.word1!";
  	byte[] buf=s.getBytes();//发送的内容(字节流)
  	int port=8888;//接收端的端口
  	DatagramPacket packet=new DatagramPacket(buf,buf.length, address, port) ;
  	//发送
  	dt.send(packet);//以包为单位进行发送
  	//关闭
  	dt.close(); 
    	}
  }

UDP接收端

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

public class recive {
    public static void main(String[] args) throws IOException {		
	//创建socket
  	DatagramSocket dt=new DatagramSocket(8888);//需要指定端口号,而且	是和发送端的一样
  	//接收数据
  	/*
   	* 创建包
   	* DatagramPacket(byte[] buf, int length) 
           构造 DatagramPacket,用来接收长度为 length 的数据包。
   	* 
   	*/
  	byte[] buf=new byte[1024];
  	DatagramPacket packet1=new DatagramPacket(buf, buf.length);
  	dt.receive(packet1);//会存在阻塞,需要点击发送端才可以运行
  	//解析
  	byte[] b=packet1.getData();//获取接收到的数组,也可以使用创建包时的数组
  	//关闭
  	dt.close();
  	System.out.print(new String(b))}
  }


运行过程中会出现阻塞:

receive(DatagramSocket p);//UDP接收端等待发送端的数据的时候,如果没有数据就一直处于等待

编写程序常遇到的错误:

端口号错误,数据可以正常发出,不会出现异常,但是接收不到数据
端口号被绑定,address already in use
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值