黑马程序员--Java--网络编程

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

网络编程

1.1 网络参考模型
OSI(open System Interconnection 开放系统互联)参考模型
TCP/IP参考模型

OSI参考模型 TCP/IP参考模型
 应用层   ------------
 表示层     应用层
 会话层   ------------
 传输层     传输层
 网络层     网络层
数据链路层 ------------
 物理成  主机至网络层

七层的描述:
1.物理层:主要定义物理设备标准:如网线的接口、光纤的接口类型等,它主要作用是传输比特流(就是1、0转化成电流的强弱来进行传输,到达目的地后在转化成1、0的数据),这一层的数据叫比特。
2.数据链路层:主要讲从物理层的数据进行MAC地址(网卡的地址)的封装和解封。
3.网络层:主要将下层接收到的数据进行IP地址的封装和解封。
4.传输层:定义一些数据的协议和端口:如TCP(传输控制协议,传输效率较低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据协议,与TCP特性恰好相反,用于传输可靠性要求低,数据量小的数据,例如QQ聊天)。
5.会话层:通过传输层建立数据传输的通道。主要在你的系统间发起会话或者接收绘画请求。
6.表示层:主要进行对接收数据进行解释,加密与解密、压缩与解压。
7.应用层:主要是一些终端的应用,如ptf、IE等

ps:
1.每个网卡的地址都是全球唯一的。
2.路由器实现将数据包发送到指定的地点
3.应用软件之间的通讯过程就是层与层之间封包、解封的过程。
4.OIS设计模型过于精细,后简化为TCP/IP参考模型。
1.2 网络通讯的要素
1.IP地址:InetAddress

网络中设备的标识;不易记忆,可用主机名。
本地回环地址:127.0.0.1 主机名:localhost

此类为构造方法,只能通过特定的静态方法获取地址:
InetAddress ia = InetAddress.getByName("192.168.0.1");
InetAddress[] ia = InetAddress.getByName("www.baidu.com");//应为百度的主机不止一台,得到的是一个地址数组。
得到地址对象后,可用其中的方法得到地址的信息:
ia.getHostName();
ia.getHostAddress();

ps:
1.IPV4数量已经不够用了,因此产生了IPV6。
2.在没有连接网络的情况下,为了能访问本机,所有分配了一个默认IP地址,就是本地回环地址。
3.通过ping 127.0.0.1 可用测试网络是不是通,如果不同,网卡出现问题。
4.每一台计算机都有自己的计算机名。

2.域名解析
例:在在浏览器中输入新浪的域名(www.sina.com.cn),DNS解析域名成IP,然后计算机再通过获得打牌的IP访问新浪的服务器。
 但是域名解析最先查看的是本地hosts(C:\WINDOWS\system32\drivers\etc\hosts)文件,解析失败了才去访问DNS服务器解析,获取IP地址。
 可以在hosts文件中自定义垃圾网站的地址为本机地址,当访问到垃圾网站了,就不会访问它的地址,而是访问本机地址。

3.端口号 
用于标识进程(应用程序)的逻辑地址,不同进程的标识。
有效端口:0-65535  其中 0-1024 系统使用或者保留端口。

4.传输协议
常见协议:TCP、UDP

UDP  
1、将数据及源和目的封装成数据包中, 不需要建立连接。
2、每个数据报的大小在限制在64k内。
3、因无连接, 是不可靠协议。
4、不需要建立连接, 速度快。
应用案例: QQ、 FeiQ聊天、 在线视频用的都是UDP传输协议。
TCP
1、建立连接, 形成传输数据的通道。
2、在连接中进行大数据量传输。
3、通过三次握手完成连接, 是可靠协议。
4、必须建立连接, 效率会稍低。
应用案例: FTP, File Transfer Protocol( 文件传输协议) 。
1.3 UDP协议 发送端与接收端
发送端:
1、建立Socket服务。
2、提供数据,并将数据封装成数据包。
3、通过Socket服务的send方法,将数据发送出去
4、关闭资源

接收端:
1、建立Socket服务,监听一个端口。
2、定义一个数据包,定义一个字节数组,用于存储接收到的信息。
3、通过Socket的receive方法将收到的数据存入已定好的数据包中。
4、通过数据包中的方法将数据取出。
5、关闭资源。

示例代码:
import java.net.*;
class  SendSocket
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket ds = new DatagramSocket(8888);

		byte[] buf = new String("传出数据").getBytes();//为传出的数据,可是和键盘输入流结合。

		DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10010);		

		ds.send(dp);

		ds.close();
	}
}

class ReceiveSocket
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket ds = new DatagramSocket(10010);

		byte[] buf = new byte[1024];

		DatagramPacket dp = new DatagramPacket(buf,buf.length);

		ds.receive(dp);//为阻塞式方法,即需要先运行,等待数据发送。
		String name = dp.getAddress().getHostName();

		String data = new String(dp.getData(),0,dp.getLength());

		int port = dp.getPort();

		System.out.println("port:"+port+" name:"+name+" data:"+data);

		ds.close();
	}
}

ps:由于UDP协议,只管数据的发送,不保证是否能接收到数据,因此,首先要先启动接收端,在启动发送端,不然接收不到数据。

1.4 TCP协议 客户端和服务端
客户端:当创建了Socket,给定主机后,就创建了输入读取流。
1、创建Socket对象。需要明确连接的主机和端口
2、通过getOutputStream()从Socket中获得输入流,调用流的write方法即可向服务端写数据了。
3、通过getInputStrream()从Socket中获得读取流,调用流的read方法读取服务端返回的数据。
4、关闭资源。

服务端:服务端对应多个客户端,与客户端的数据传输用到的是客户端的流。
1、创建ServerSocket对象。需要明确连接的端口
2、调用ServerSocket中的accept方法获得对应的客户端对象,
3、调用客户端Socket的getInputStream方法读取客户端发送的数据,调用getOutputStream方法给客户端发送数据。
4、关闭资源。需要关闭服务端和客户端。

ps:TCP协议需要先开服务端,再开客户端。

练习代码:TCP协议上传文本文件:
import java.net.*;
import java.io.*;

class  Client
{
	public static void main(String[] args) throws UnknownHostException,IOException
	{
		Socket s = new Socket("127.0.0.1",10012);

		BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));

		PrintWriter out = new PrintWriter(s.getOutputStream(),true);

		String line ;

		while((line = bufr.readLine())!=null){

			out.println(line);
		}
		
		s.shutdownOutput();//加入结束标记,以确定向服务端传送数据动作结束。

		BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
		
		System.out.println(in.readLine());

		s.close();

		bufr.close();
	}
}

class Server
{
	public static void main(String[] args) throws IOException
	{
		ServerSocket ss = new ServerSocket(10012);

		Socket s = ss.accept();

		BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));

		BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));

		String line;

		while((line=in.readLine())!=null){

			bufw.write(line);
			bufw.newLine();
		}

		PrintWriter out = new PrintWriter(s.getOutputStream(),true);

		out.println("已收到数据,上传成功");//print()方法不会自动刷新出缓冲区。

		s.close();

		bufw.close();

		ss.close();
	}
}
1.5 了解客户端
自定义服务端:
class MyServer{
	public static void main(String[] args) throws IOException{
		ServerSocket ss = new ServerSocket(10010);
		Socket s = ss.accept();
		InputStream in = s.getInputStream();
		byte[] buf = new byte[1024];
		int len = in.read(buf);
		System.out.println(new String(buf,0,len));
		
		PrintWriter out = new PrintWriter(s.getOutputStream(),true);
		out.println("<font color='red' size='7'>欢迎光临</font>");
		
		s.close();
		ss.close();
	}
}

运行结果:
GET / HTTP/1.1
Host: 127.0.0.1:10010
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0
.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8

发送的是请求消息头.

相应的当服务端也为浏览器时,会给客户端包括:应答消息头和消息主体。
1.6 URL和URLconnection
URI:统一资源标示符。
URL:统一资源定位符,也就是说可以根据URL定位网络上的某个资源,他是指向互联网资源的指针。
每个URL都是URI,但不是每个URI都是URL。应为URI还包括一个字类URN(统一资源名称),他命名资源但不指定如何定位资源。

示例:
String str =  "http://192.168.1.100:8080/myweb/1.html?name=lisi";
URL u = new URL(str);

就可有通过URL中的方法获得对应主机端口中的信息。
u.getProtocol():协议
u.getHost(): 主机地址
u.getPort():端口
u.getFile():文件路径和文件信息
u.getPath():目录路径
u.getQuery():键值对参数信息

最重要的:
URLConnection c = u.openConnection():把消息的主体按消息头解析后封装成了对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值