黑马程序员——Java基础——网络编程

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

package cn.fuxi._01net;
/**
 * 网络编程
 * 参考模型
 * OSI(Open System Interconnected 开发系统互联)参考模型
 * TCP/IP 参考模型
 * -----------------------------------------------------------
 * OSI参考模型			<span style="white-space:pre">		</span>TCP/IP参考模型
 * 应用层
 * 表示层						应用层
 * 会话层
 * -----------------------------------------------------------
 * 传输层						传输层
 * -----------------------------------------------------------
 * 网络层						网络层
 * -----------------------------------------------------------
 * 数据链路层					  主机至网络层
 * 物理层
 * -----------------------------------------------------------
 * PS:数据由上往下走是封包的过程.
 * 	     数据由下往上走是解封包的过程.
 * 
 * 
 * 1.物理层:主要定义物理设备标准,如网线的接口类型.光纤的接口类型,各种传输介质的传输速率等.
 * 		它的主要作用是传输比特流(就是1,0转化为电流强弱来进行传输,到达目的后再转化为1,0 也就
 * 		是我们常说的数模转化和模数转化).这一层的数据叫比特.
 * 2.数据链路层:主要将从物理层接收的数据经行MAC地址(网卡的地址)的封装与解封装.常把这一层的数据
 * 		叫做帧.这一层工作的设备是交换机,数据通过交换机来传输.
 * 3.网络层:主要将下层接收到的数据经行IP地址(例:192.168.1.2)的封装与解封装.在这一层工作的
 * 		设备是路由器,常把这一层的数据叫做数据包.
 * 4.传输层:定义了一些传输数据的协议和端口号(www端口号80等),如:TCP(传输控制协议,可靠性强,用
 * 		于传输可靠性要求不高,数据量小的数据,如qq聊天数据就是通过这种方式传输的).主要是将从下层
 * 		接收的数据进行分段和传输,到达目的地址后再经行重组,常常把这一层叫做段.
 * 5.会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路.主要在你的系统之间发起会话或
 * 		者接收会话请求(设备之间需要互相认识可以是IP也可以是MAC或者主机名).
 * 6.表示层:主要是经行对接收的数据进行解释,加密与解密,压缩与解压缩等(也就是把计算机能够识别的东西
 * 		转换成人能够识别的东西,如图片,声音等).
 * 7.应用层:主要是一些终端的应用,比如说FTP(各种文件下载),WEB(IE浏览),QQ之类的(可以把它理解成
 * 		我们在电脑屏幕上可以看到的东西,就是终端应用).
 * 
 * P.S.
 * 1.每个网卡的MAC地址都是全球唯一的.
 * 2.路由器实现将数据包发送到指定的地点.
 * 3.应用软件之间同行的过程就是层与层之间封包,解封包的过程.
 * 4.OSI参考模型虽然设计精细,但过于麻烦,效率不高,因此才产生了简化版的TCP/IP参考模型.
 * ---------------------------------------------------------------------------------------------------
 * 网络通讯要素
 * 
 * 1.IP地址:InetAddress
 * 网络中设备的标识.
 * 不易记忆,可用主机名.
 * 本地回环地址:127.0.0.1主机名:localhost.
 * 
 * P.S.
 * 1.查看本机IP地址.
 * 2.IPV4数量已经不够分配,所以产生了IPV6.
 * 3.在没有连接互联网的情况,为了让访问本机方便,所以分配了一个默认的IP地址,也就是本地回环地址.
 * 4.通过 ping 127.0.0.1可以测试网络是不是通,如果不通,可能拾网卡出问题了.
 * 5.每台机器都有自己制定的计算机名.
 * ----------------------------------------------------------------------------------------------------
 * 2.端口号
 * 	用于标识进程(应用程序)的逻辑地址,不通进程的标识/
 * 	有效端口:0~65535,其中0~1024系统使用或保留的端口.
 * 
 * P.S.
 * 1.当一台计算机A向另一台计算机B发送QQ信息是,首先路由器通过数据包中的IP地址定位该醒醒发送到哪一台机器.
 * 		然后计算机B接收到数据包后,通过此数据包中的端口号定位到发送给本机的QQ应用程序.
 * 2.所谓防火墙,其功能就是将发送到某程序端口的数据屏蔽掉以及将从该程序端口发出的数据也屏蔽掉.
 * ----------------------------------------------------------------------------------------------------
 * 3.传输协议
 * 
 * 通讯的规则.
 * 常见协议UDP , TCP
 * 
 * UDP
 * 将数据及源和目的封装成数据包,不需要建立连接.
 * 每个数据包的大小都在64k内
 * 因无连接,是不可靠协议
 * 不需要建立连接,速度快.
 * 应用案例:qq,FeiQ聊天,在线视频
 * 
 * TCP
 * 建立连接,形成传输数据的通道.
 * 在连接中进行大量数据传输
 * 通过三次握手完成连接,是可靠协议
 * 必须建立连接,效率会稍低.
 * 应用案列:FTP(文件传输协议)
 */

import java.net.*;
public class _01NetDemo01 {
	public static void main(String[] args) throws UnknownHostException {
		//获取本地主机IP地址对象
		InetAddress ip = InetAddress.getLocalHost();
		System.out.println(ip.getHostAddress());//192.168.1.102
		System.out.println(ip.getHostName());//宝坛的PC机
		System.out.println("--------------------");
		ip = InetAddress.getByName("www.baidu.com");
		System.out.println(ip.getHostAddress());//61.135.169.121
		System.out.println(ip.getHostName());//www.baidu.com
	}
}
/*
 * P.S.
 * InetAddress类中有一个静态方法
 * static InetAddress[] getAllbyName(String host),此方法是在给
 * 定主机名的情况下,根据系统上配置的名称服务返回其IP地址所组成的数据.这是由于
 * 有些主机名对应的IP地址不唯一,如新浪,百度,都是服务器集群.
 */
输出结果:
192.168.1.102
传奇查的PC机
--------------------
61.135.169.125
www.baidu.com

package cn.fuxi._01net;
/**
 * 在浏览器中输入新浪的域名,DNS解析域名成IP,然后计算机再通过获取到IP访问新浪服务器
 * 域名解析,最先走是本地的hosts文件,解析失败了,才去访问DNS服务器解析,获取IP地址.
 * 
 * 应用:通过hosts文件可以屏蔽游戏网站内容弹出,列如:在hosts文件中添加,127.0.0.1 www.game18.com.
 */
import java.net.*;
public class _02NetDemo02 {
	public static void main(String[] args) throws UnknownHostException {
		InetAddress ip = InetAddress.getLocalHost();
		ip = InetAddress.getByName("192.168.110");
		System.out.println(ip.getHostAddress());//192.168.0.110
		System.out.println(ip.getHostName());//192.168.0.110
	}

}
输出结果:
192.168.0.110
192.168.0.110

package cn.fuxi._01net;
/**
 * UDP 协议-发送端&接收端
 * Socket
 * Socket急速为网络服务提供的一种机制.
 * 通信的两端都有Socket
 * 网络通讯其实就是Socket间的通信.
 * 数据在两个Socket间通过IO传输.
 * 
 * UDP传输
 * 
 * DatagramSocket(用来发送和接搜数据抱包的套接字)与DatagramPacket(数据报包).
 * 建立发送端,接收端.
 * 建立数据包
 * 调用Socket的发送接收方法.
 * 关闭Socket.
 * 发送端与接收端是两个独立的运行程序.
 */
//UDP发送端

import java.io.IOException;
import java.net.*;

public class _03UDPSendDemo {
	public static void main(String[] args) throws IOException {
		System.out.println("发送端启动...");
		/*
		 * 创建UDP传输的发送端.
		 * 思路:
		 * 1.建立udp的socket服务.
		 * 2.将要发送的数据封装到数据包中去.
		 * 3.通过udp的socket服务将数据包发送出去
		 * 4.关闭socket服务. 
		 */
		//1.udpsonket服务,使用DatagramSocket对象
		//如果发送端口未指定,就会随机分配未被使用的端口.
		DatagramSocket ds = new DatagramSocket(5432);
		//2.将要发送的数据封装到数据包中.
		String str = "UDP数据传输演示:哥淡定的来了~~";
		//使用DatagramPocket将数据封装到该对象包中.
		byte[] buf = str.getBytes();
		DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("114.249.197.120"),10000);
		//3.通过UDP的socket服务将数据包发送出去,使用send方法.
		ds.send(dp);
		//4.关闭资源.
		ds.close();
	}

}

package cn.fuxi._01net;
/**
 * UDP接收端
 */
import java.io.IOException;
import java.net.*;

public class _04UDPReceDemo {
	public static void main(String[] args) throws IOException {
		System.out.println("接收端启动...");
		/*
		 *建立UDP接收端的思路.
		 *思路:
		 *1.建立UDP的socket服务,因为是要接收数据,必须要明确一个端口号.
		 *2.创建数据包,用于存储接收到的数据,方便使用数据包对象的方法解析这些数据.
		 *3.使用socket服务的receive方法将接收到的数据存储到数据包中.
		 *4.通过数据包的方法解析数据包中你的数据.
		 *5.关闭资源. 
		 */
		//1.创建UDPsocket服务.
		DatagramSocket ds = new DatagramSocket(10000);
		//2.创建数据包.
		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf,buf.length);
		//使用接收方法将数据存储到数据包中.
		ds.receive(dp);//阻塞式的.
		//4.通过数据包对象的方法,接收其中的数据,比如:地址,端口,数据内容.
		String ip = dp.getAddress().getHostAddress();
		//获取的接口端是发送端的端口号.
		int port = dp.getPort();
		String text = new String(dp.getData(),0,dp.getLength());
		System.out.println(ip+":"+port+":"+text);
		//5.关闭资源
		ds.close();
	}
}
/*
 *P.S.
 *		由于UDP协议传输数据,只管发送数据,而不管接收端是否能够接收到数据.因此,应该首先启动接收
 *		端程序,再启动发送端程序. 
 * 
 */




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值