网络编程

一.网络编程

A:网络编程三要素

1.ip地址(网络中设备的标识,不易记忆,可用主机名)

a:概述:ip地址就是给每一个连接在Internet上的主机分配的一个32bit地址

b:组成:IP地址 = 网络地址+主机地址
A类IP地址:第一段号码为网络地址,剩下的三段号码为本地计算机的号码
B类IP地址:前二段号码为网络地址,剩下的二段号码为本地计算机的号码
C类IP地址:前三段号码为网络地址,剩下的一段号码为本地计算机的号码

c:分类:   A类 1.0.0.1---127.255.255.254
(1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址)
(2)127.X.X.X是保留地址,用做循环测试用的。
B类 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。
C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
D类 224.0.0.1---239.255.255.254

E类 240.0.0.1---247.255.255.254

d:特殊地址:

               127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1   
DOS命令 ipconfig:查看本机IP地址
xxx.xxx.xxx.255 广播地址

2.端口(用于标识进程的逻辑地址,不同进程的标识)

               物理端口 网卡口
逻辑端口 我们指的就是逻辑端口
a:每个网络程序都会有一个逻辑端口
b:用于标识进程的逻辑地址,不同进程的标识
c:有效端口:0~65535(两个字节),其中0~1024系统使用或保留端口。

3.协议(通讯的规则常见协议:TCP,UDP)

UDP
将数据源和目的封装成数据包中,不需要建立连接;
每个数据报的大小在限制在64k;
因无连接,是不可靠协议;

不需要建立连接,速度快

TCP
建立连接,形成传输数据的通道;
在连接中进行大数据量传输;
需要连接所以是可靠协议;

必须建立连接,效率会稍低

二.InetAddress类的概述和使用

A:概述:为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用

此类表示互联网协议 (IP) 地址。 

B:InetAddress类的常见功能
public static InetAddress getByName(String host)//确定主机的IP地址,给定主机名
public String getHostAddress()//获取IP

public String getHostName()//获取主机名

C:案例演示:

实现这些功能

测试类:

public class Test {

	public static void main(String[] args) throws IOException {
		//方式一 :使用主机名来创建对象
		InetAddress address = InetAddress.getByName( "DESKTOP-FTNI8AJ");
		//获取ip地址
		String ip = address.getHostAddress();
		//获取主机名
        String hostName = address.getHostName();
        System.out.println(ip);
        System.out.println(hostName);
        System.out.println("---------------------------------");
        //方式二:使用ip地址来创建对象
        InetAddress address2 = InetAddress.getByName("192.168.9.131");
        //获取ip地址
        String ip2 = address2.getHostAddress();
        //获取主机名
        String hostName2 = address2.getHostName();
        System.out.println(ip2);
        System.out.println(hostName2);
	}

}
192.168.9.131
DESKTOP-FTNI8AJ
---------------------------------
192.168.9.131
DESKTOP-FTNI8AJ

三.Socket通信

A:Socket通信

a:Socket=IP+端口号
b:Socket套接字概述:网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。

B:Socket原理机制:

通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。

C:Socket通信的原理图

     

四.UDP协议发送数据

A:UDP协议发送接收数据的原理图


B:UDP发送数据(客户端)的步骤:

a: 创建UDP通讯客户端对象(DatagramSocket)   public DatagramSocket()

b: 创建数据报包  public DatagramPacket(byte[] buf, int length, InetAddress address,int port)

c:发送数据  send();

d:释放资源

C:UDP接收数据(服务器端)的步骤:

a:创建UDP通讯协议服务器端对象(DatagramSocket) 注意要用有参数构造 指定端口号

 public DatagramSocket(int port)

b:创建数据报包,作用用来接收数据   public DatagramPacket(byte[] buf, int length)

c:接收数据    receive(dp) 

d:解析数据报包,拿出数据   dp.getData() ;  dp.getLength()

e:释放资源   

案例演示一:UDP协议发送端的数据是一句话

客户端:

public class UDPServer {

	public static void main(String[] args) throws IOException {
//		a:创建UDP通讯协议服务器端对象(DatagramSocket) 注意要用有参数构造 指定端口号
//		 public DatagramSocket(int port)
//
//		b:创建数据报包,作用用来接收数据   public DatagramPacket(byte[] buf, int length)
//		c:接收数据    receive(dp) 
//		d:解析数据报包,拿出数据   dp.getData() ;  dp.getLength()
//		e:释放资源
		//1.创建一个UDP服务器对象,暴露端口号
		DatagramSocket ds=new DatagramSocket(10001);
		//2.创建数据报包
		byte[]by=new byte[1024];
		int length=by.length;
		DatagramPacket dp = new DatagramPacket(by, length);
		//3.接收数据 
		ds.receive(dp);//服务器在这里停着呢 等待接受数据
		//4.解析数据
		//获取数据
		byte[] data = dp.getData();
		//获取数据的长度
		int length2 = dp.getLength();
		//DatagramPacket中的方法getAddress()
		//返回的IP地址的机器,这个数据包被发送或从收到的数据报。
		InetAddress address = dp.getAddress();
		//获取ip地址
		String hostAddress = address.getHostAddress();
		//将数据转换为字符串输出
		String string = new String(data,0,length2);
		System.out.println(address+"发送来的数据时"+string);	
	}
}

服务器端:

结果:

192.168.9.131发送来的数据时我是UDP,我来啦

案例演示二:UDP协议发送端的数据来自于键盘录入


客户端:只是修改客户端的代码,服务器端不变

public class UDPClient {

	public static void main(String[] args) throws IOException {
		//案例:UDP协议发送端的数据来自于键盘录入
		//1.创建UDP对象
		DatagramSocket ds=new DatagramSocket();
		//2.键盘录入数据
		BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
		//获取IP地址的对象
		InetAddress address = InetAddress.getByName("192.168.9.131");
		while(true) {
			System.out.println("请输入要发送的数据");
			String string=bfr.readLine();
			if(string.equals(886)) {
				break;
			}
			byte[] by=string.getBytes();
			int length=by.length;
			//4.创建数据报包,发送数据
			DatagramPacket dp=new DatagramPacket(by,length,address,10002);
			ds.send(dp);	
		}
		//5.释放数据
		ds.close();
	}
}

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值