『Java』网络编程--网络编程概念+UDP基础

网络编程----说白了就是Socket编程.....

✔网络模型

OSI参考模型

TCP/IP参考模型

✔网络通讯要素

IP地址

端口号

传输协议

 

 

应用层--协议:http,ftp等

传输层--协议:tcp,udp

网际层—协议:ip

 

网络通讯要素

✔IP地址

网络中设备的标识

不易记忆,可用主机名

本地回环地址:127.0.0.1 主机名:localHost

✔端口号

用于标识进程的逻辑地址,不同进程标识

有效端口:0~65535,其中0~1024系统使用或保留端口

✔传输协议

通讯的规则

常见协议:TCP,UDP

 

TCP和UDP

✔UDP

将数据及源和目的封装成数据包中,不需要建立连接

每个数据报的大小限制在64K内

因无连接,是不可靠协议

不需要建立连接,速度快

✔TCP

建立连接,形成传输数据的通道

在连接中进行大数据量的传输

通过三次握手完成连接,是可靠协议

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

 

 

UDP面向无连接,数据需要封包(限制在没包64K以内).现实比拟,邮局发包裹.

TCP面向连接,现实比拟打电话过程.UDP现实比拟对讲机传话过程.

 

 

 

java.net 包中,用于描述IP地址的
类 InetAddress

 

 

 

 

Socket

✔Socket就是为网络服务提供的一种机制

✔通信的两端都有Socket

✔网络通信其实就是Socket间的通信

✔数据在两个Socket间通过IO传输

 

Socket[插座;套接字]玩Socket主要记住流程.----网络编程就是Socket编程

 

 

 

Socket就是港口.接送货物的...

 

 

UDP传输

✔DatagramSocket与DatagramPacket

✔建立发送端,接受端

✔建立数据包

✔调用Socket的发送接受方法

✔关闭Socket

发送端与接收端是两个独立的运行程序

 

 

 

需求一:通过UDP协议传输一段文字数据到指定目的地.

思路:

1,建立UDPSocket服务

2,提供数据,并将数据封装到数据包中

3,通过socket服务的发送功能,将数据包发出去

4,关闭资源

 

 

 

 

需求二:接受一个UDP协议传输过来的数据

思路:

1,定义UDPSocket服务,通常会监听一个端口,其实就是给这个接受网络应哟个程序定义数字标识.

方便于明确那些数据过来该应用程序可以处理.

2,定义一个数据包,因为要存储接受到的字节数据

因为数据包对象中有更多功能可以提取字节数据中的不同数据信息

3,通过socket服务的receive()方法将收到的数据存入已经定义好的数据包中

4,通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上

5,关闭资源ok

 

接收端要指定一个监听的端口,时刻关注属于自己的包裹.


 

 

 

实例:实现,循环输入,循环接收………
import java.io.*;
import java.net.*;
class UdpSend{
	public static void main(String[] args)throws Exception{
	//建立socket服务,参数默认,系统自动分配端口.
	DatagramSocket ds=new DatagramSocket();
	//实现,键盘录入,实时发送消息
	BufferedReader bur=
		new BufferedReader(new InputStreamReader(System.in));
	String line=null;
	while((line=bur.readLine())!=null){
		if(line.equals("exit"))
			break;
		byte[] btbuf=line.getBytes();
		//建立包裹,指定数据缓冲byte数组和其长度,并指定ip,和端口
		DatagramPacket dp=new DatagramPacket(btbuf,btbuf.length,InetAddress.getByName("127.0.0.1"),10000);
		//发送.
		ds.send(dp);
	}
	//exit后,关闭
		ds.close();
	}
	
	
	
	
}
class UdpRece{
	public static void main(String[] args)throws Exception{
	//建立服务,指定以下端口,让他在这个端口处等候,包裹的到来
	DatagramSocket ds=new DatagramSocket(10000);
	//建立循环接受---内部有阻塞方法,不能构成死循环
	while(true){//注意 new DatagramSocket不要丢尽循环,会报[端口绑定异常]
	//建立byte缓存,以便下面等待包裹
	byte[] buf=new byte[1024];
	//建立包裹存储收到的包裹
	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+"---"+dp.getPort());
	}

	}
}

 

注意:

 

192.168.1.0网络段

192.168.1.255广播地址,所有的ip段内的ip都能接收到.

 

用UDP自制简单局域网聊天小程序

 

import java.io.*;
import java.net.*;
class UdpSend implements Runnable{
	private DatagramSocket ds;
	UdpSend(DatagramSocket ds){
		this.ds=ds;
	}
	public void run(){
	//建立socket服务,参数默认,系统自动分配端口.
	try{
	//实现,键盘录入,实时发送消息
		System.out.println("----------------------------------");
	BufferedReader bur=
								new BufferedReader(new InputStreamReader(System.in));
	String line=null;
	while((line=bur.readLine())!=null){
	
		if(line.equals("exit"))
			break;
		byte[] btbuf=line.getBytes();
		//建立包裹,指定数据缓冲byte数组和其长度,并指定ip,和端口
		DatagramPacket dp=new DatagramPacket(btbuf,btbuf.length,InetAddress.getByName("192.168.1.255"),10000);
		//发送.
		ds.send(dp);
	}
	//exit后,关闭
		ds.close();
	}
	catch(Exception i){
		throw new RuntimeException("检修");
	}
	
	
	
}
}
class UdpRece implements Runnable{
	private DatagramSocket ds;
	UdpRece(DatagramSocket ds){
		this.ds=ds;
	}
	public void run(){
	try{
	//建立服务,指定以下端口,让他在这个端口处等候,包裹的到来
	//建立循环接受
	while(true){
	//建立byte缓存,以便下面等待包裹
	byte[] buf=new byte[1024];
	//建立包裹存储收到的包裹
	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("*******************************");
	System.out.println(ip+":"+data+"---"+dp.getPort());
	System.out.println("*******************************");
	}

	}catch(Exception e){
			throw new RuntimeException("  ");
	}
}
}
class chat{
	public static void main(String[] args)throws Exception{
	DatagramSocket ds=new DatagramSocket();
	DatagramSocket d=new DatagramSocket(10000);
	System.out.println("聊天模式启动");
	new Thread(new UdpSend(ds)).start();
	new Thread(new UdpRece(d)).start();

	}


}

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值