现在的位置: 首页 > 编程语言 > 正文

黑马程序员_网络编程学习笔记–>代码主要是对UDP协议的讲解

2018年09月16日 编程语言 ⁄ 共 4617字 ⁄ 字号 评论关闭

---------------------- android培训java培训、期待与您交流! ----------------------

 

 

 

网络编程学习笔记-->代码主要是对UDP协议的讲解
//数据传输 就是把自己电脑上的数据传输到别人电脑上前提是需要连接
网络就是多台计算机之间的互联
网络模型:osi(开放系统互联)
7层:
1.物理层:网线的接口类型光纤的接口类型
也就是数字模式和和莫属转换这一层的数据叫做比特
2数据连接层:主要从物理接受的数据进行MAC地址的封装与解封装
3 网络层:将从下层加收的数据进行ip地址的封装与解封装在这一层的设备是路由器常把这一层的数据叫做数据包
4:传输层从下层的几首的数据进行分段和传输
5:会话层 通过传输层建立数据传输的通路
6:表示层:对下一层的数据进行转换成人能识别的东西
7:应用层
网络三要素:
1.ip地址:不易记忆 可用主机名称 网络中设备的标识(本地回环地址:127.0.0.1 主机名:localhost)
2端口号:用于标识进程的逻辑地址 不同进程的标识 有效端口 0~65535其中0~1024系统使用或保留端口
3传输协议:常用的有两种TCP和UDP
UDP协议:数据包协议 将数据及源和摸底封装成数据包不需要建立连接
大小有限制 在64KB内
因为没有连接是不可靠协议 但是又因为没有连接所以速度快
(传输大量数据时将数据分割为多个64KB的数据包每个数据包都有一个校验码在目的地址进行拼接的时候会还原数据)
=============================================
TCP协议:建立连接 形成传输数据的通道
在连接中进行大数据量的传输
通过三次握手完成连接是可靠协议
又是因为需要建立连接所以效率不高
DNS服务器的原理:
在浏览器输入网站地址是 首先先去本地找DNS服务器解析 如果本地没有DNS服务解析那么去互联网上去寻找DNS服务器解析 解析后获得要访问网站的ip地址返回给主机进行网络连接
Socket是为网络服务的一种机制
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个socket间通过IO传输
(任何一种传输都需要通讯端点)
不管是UDP还是TCP都离不开 InetAddress 类

InetAddress 类 此类表示互联网协议 (IP) 地址
如果想拿到任意一台主机的IP地址对象那么使用方法
static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
如果想获得百度 或者新浪的ip地址(连接互联网的情况)
InetAddress.getByName("www.baidu.com")-->这样会获得百度使用的ip地址
(上面这个方法非常常用以后的编程和学习当中经常用到)
 String getHostAddress()  返回 IP 地址字符串(以文本表现形式)。 
使用UDP协议进行Socket编程制作涉及到插座的概念 就是两个软件之间有一种通信通过某种介质连接
下面使用UDP的传输服务
使用到的类 DatagramSocket  此类表示用来发送和接收数据报包的套接字
该类既能发送数据也接受数据  也就是在两个端点都会有该类的相关使用
该类对象的两个方法 一个发送数据 一个接收数据
--------------------------------------------------
 void receive(DatagramPacket p) 
          从此套接字接收数据报包。 
 void send(DatagramPacket p) 
          从此套接字发送数据报包 
--------------------------------------------------
将数据封装承包
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号
下面是一个用UDP协议做的小应用程序
发送端代码:
public class DUPSend {
	public static void main(String[] args) throws Exception {
//		DatagramSocket ds=new DatagramSocket();
//		String Text="gsdyfgsdkhglfhdk";
//		byte[] buffer=Text.getBytes();
//		DatagramPacket dp=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("10.31.1.69"),10000);
//		ds.send(dp);
//		ds.close();
		/*
		 * 需求-->定义了一个发送端
		 * 通过UDP的传输方式讲一段文字发送出去
		 * 思路:
		 * 建立UDPSocket服务对象
		 * 提供数据并将数据封装到数据包中
		 * 提供Socket服务对象的发送功能将数据包发送出去
		 * 关闭资源
		 * 
		 */
		
		//创建UDP服务  建立DataGramSocket对象
		System.out.println("发送端....");
		DatagramSocket ds=new DatagramSocket();
		//确定数据并封装成包 DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 
		byte[] data="UDP Data".getBytes() ;
		DatagramPacket dp=new DatagramPacket(data, data.length, InetAddress.getByName("10.1.31.50"), 10000);
		//通过Socket服务将已有的数据包发送出去 通过send方法
		ds.send(dp);
		//关闭资源
		ds.close();
		
	}
}
接收端代码:
package itcast;

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

public class UDPRece {
	public static void main(String[] args) throws Exception {
		/*
		 * 需求:定义一个应用程序用于接收UDP协议传输的数据并处理
		 * 思路:定义一个UDPSocket服务 通常就是监听一个端口其实就是给这个网络应用程序定义数字标识方便与明确那些数据过来该
		 * 		定义一个数据包因为要存储接收到的字节数据以为数据包对象中有更多的功能可以提取字节数据中的不同数据信息
		 * 通过Socket服务对象的Receive方法将接受到的数据存入已定义好的数据包中
		 * 通过数据包对象特有的功能将这些不同的数据取出打印在控制台上
		 * 关闭资源
		 */
		//创建UDP服务 建立端点
		System.out.println("接受端....");
		DatagramSocket ds=new DatagramSocket(10000);
		//d定义数据包
		byte[] buffer=new byte[1024];
		DatagramPacket dp=new DatagramPacket(buffer, buffer.length);
		//通过Socket的Receive方法接收数据
		ds.receive(dp);
		//通过数据包的方法获取其中的数据
		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传输协议做的简易的聊天应用窗口
public class ChatDemo {
	public static void main(String[] args) throws Exception {
		DatagramSocket send=new DatagramSocket();
		DatagramSocket rece=new DatagramSocket(10001);
		Send ss=new Send(send);
		Rece reve=new Rece(rece);
		Thread t1=new Thread(ss);
		Thread t2=new Thread(reve);
		t1.start();
		t2.start();
	}
}

/*
 * 因为收发的动作是不一致的所以要定义两个run方法 而且这两个方法要封装到不同的类中
 */
class Send implements Runnable {
	private DatagramSocket ds = null;

	public Send(DatagramSocket ds) throws Exception {
		this.ds = ds;
	}

	@Override
	public void run() {
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(
					System.in));
			byte[] buffer = new byte[1024];
			String line = null;
			while ((line = br.readLine()) != null) {
				if ((line.equals("886"))) {
					break;
				}
			
				// 打包
				buffer=line.getBytes();
				DatagramPacket dp = new DatagramPacket(buffer, buffer.length,
						InetAddress.getByName("10.1.31.50"), 10001);
				ds.send(dp);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

class Rece implements Runnable {
	private DatagramSocket ds = null;

	public Rece(DatagramSocket ds) throws Exception {
		this.ds = ds;
	}

	@Override
	public void run() {

		while (true) {
			byte[] buffer = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
			try {
				ds.receive(dp);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			String ip = dp.getAddress().getHostAddress();
			String data = new String(dp.getData(), 0, dp.getLength());
			System.out.println(ip + "  ::  " + data);
		}
	}

}


 

---------------------- android培训java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima

抱歉!评论已关闭.