网络编程

网络编程概述

网络模型

OSI参考模型
TCP/IP参考模型

网络参考模型

物理层: 主要定义物理设备标准,如网络的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用事传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后再转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特(bit)。

数据链路层: 主要讲从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。

网络层: 主要将从下层接收到的数据进行IP地址(例192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。

传输层: 定义了一些传输数据的协议和端口号(WWW端口80等),如TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。

会话层: 通过传输层(端口号:传输接口与接收接口)建立数据传输的通路。主要在你的系统之间发起会话或者接收会话请求(设备之间需要相互认识,可以是IP也可以是MAC或者主机名)

表示层: 主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够识别的东西,如图像、声音等)

应用层: 主要是一些终端的应用,比如FTP(各种文件下载)、WEB(IE浏览器)、QQ之类的(可以把它理解成我们在电脑屏幕上可以看到的东西,就是终端应用)

网络通讯要素

IP地址:InetAddress

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

端口号

  • 用于标识进程的逻辑地址,不同进程的标识
  • 有效端口:065535,其中01024系统使用或保留端口

传输协议

通讯的规则

常见协议:

1. TCP(传输控制协议):

  • 建立连接,形成传输数据的通道
  • 在连接中进行大数据量传输
  • 通过三次握手完成连接,是可靠协议
  • 必须建立连接,效率会稍低

2. UDP(用户数据报协议):

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

Socket

  • Socket就是为网络服务提供的一种机制
  • 通信的两端都有Socket
  • 网络通信其实就是Socket间的通信
  • 数据在两个Socket间通过IO传输

UDP传输

DatagramSocketDatagramPacket

步骤:

  1. 建立发送端,接收端
  2. 建立数据包
  3. 调用Socket的发送接收方法
  4. 关闭Socket

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

发送端:

//1. 建立udp的socket,它具备发送或者接收功能
DatagramSocket ds = new DatagramSocket(8888);

//2. 将数据封装到数据包中,数据包对象是DatagramPacket
String text = "hello,udp来了";
byte[] buf = text.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000);

//3. 使用socket对象的send方法将数据包发送出去
ds.send(dp);
//4. 关闭资源
ds.close();

接收端:

//1.先有udpsocket服务
DatagramSocket dSocket = new DatagramSocket(10000);

//2.接收数据,先将数据存储到数据包中
//3.定义数据包
byte[] buf = new byte[1024];
DatagramPacket dPacket = new DatagramPacket(buf, buf.length);
dSocket.receive(dPacket);//阻塞

//4.通过数据包对象获取数据包中的各项内容:发送端ip,发送端的端口,发送过来的数据
String ip = dPacket.getAddress().getHostAddress();
int port = dPacket.getPort();
String text = new String(dPacket.getData(), 0, dPacket.getLength());
System.out.println(ip+'+'+port+':'+text);

//5.关闭资源
dSocket.close();

多次传输
(io.github.xenaliu.d20200113.udp2)

群聊
需求:通过键盘录入获取要发送的信息;将发送和接收分别封装到两个线程中。
(/net/src/io/github/xenaliu/d20200113/chat/UDPChatTest.java)

TCP传输

SocketServerSocket

步骤:

  1. 建立客户端和服务器端
  2. 建立连接后,通过Socket中的IO流进行数据的传输
  3. 关闭socket

同样,客户端与服务器端是两个独立的应用程序。

基本思路:

客户端:

  • 客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。
  • 连接成功,说明客户端与服务端建立了通道,那么 通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过getInputStream()getOutputStream()获取即可。
  • 与服务端通讯结束后,关闭Socket。
// 1.建立tcp的客户端socket。明确服务端的地址和端口
Socket s = new Socket("127.0.0.255",10001);

//2.如果通道建立成功就会出现socket io流
//客户端需要做的就是获取socket流中的输出流将数据发送到目的地服务端
OutputStream out = s.getOutputStream();

//3.通过socket输出流将数据发送
out.write("hello tcp".getBytes());

//4.关闭资源
s.close();

服务端:

  • 服务端需要明确它要处理的数据是从哪个 端口进入的。
  • 当有客户端访问时,要明确是哪个客户 端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输。
  • 当该客户端访问结束,关闭该客户端。
//1.创建服务端的socket。一定要明确端口,监听一个端口
ServerSocket ss = new ServerSocket(10001);

//2.服务区只要获取连接过来的客户端就可以和指定的客户端通信了
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"............connected");

//3.通过获取客户端的读取流对象读取客户端发来的数据
InputStream in = s.getInputStream();

//4.显示在屏幕上
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);

//5.关闭资源
s.close();
ss.close();

客户端与服务端的交互
(io.github.xenaliu.d20200113.tcp2)

频繁的客户端与服务端通信
需求:客户端通过键盘录入发送数据到服务端,服务端将接收到的数据显示到频幕上的同时将这些数据转成大写发回给客户端。当客户端录入的是“over”时,大写转换结束。
客户端:
1. 创建客户端socket,明确地址和端口
2. 明确源和目的
源:键盘录入。获取需要转换的数据。
目的:网络,socket输出流。将录入的数据发送到服务端。
3. 读取服务器返回的数据
源:socket读取流。读取服务端发回来的大写数据。
目的:客户端显示器,将大写数据显示在屏幕上。
4. 频繁的读写操作
5. 关闭资源
服务端:
1. 创建服务端socket,明确端口
2. 明确源和目的
源:socket输入流。读取客户端发过来的数据
目的:socket输出流。将转成大写的数据发送给客户端
3. 频繁的读写操作
5. 关闭客户端
(io.github.xenaliu.d20200113.tcptrans)

上传文本文件
(io.github.xenaliu.d20200113.uploadtext)

通过字节流上传图片
问:为什么不能用字符流上传媒体文件?
(io.github.xenaliu.d20200113.uploadpic)

常见的客户端和服务端

客户端: 浏览器
服务端: Tomcat

演示一:
客户端:浏览器
服务端:Tomcat
访问方式:输入http://192.168.1.223:8080/自己的应用程序名称/具体的资源名称

演示二:了解浏览器做了什么事情
客户端:浏览器
服务端:自定义的服务端myServer

http的请求消息:

请求头
请求行:请求方式 访问资源的路径 HTTP协议版本

GET / HTTP/1.1

属性信息
Accept: text/html, application/xhtml+xml, image/jxr, */*
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost:9090
Connection: Keep-Alive

请求体

演示三:模拟一个浏览器
客户端:自定义的浏览器
服务端:Tomcat

URL

URL: 用于解析url地址
URLconnetcion: 获取url的连接

HTTP1.0和HTTP1.1

HTTP1.0: 一次连接只能有一次请求
HTTP1.1: 一次连接多次请求

常见的网络架构

C/S:client/server

特点:

  1. 程序员需要开发客户端和服务端
  2. 维护较为麻烦
  3. 将一部分运算转移到客户端来完成,可以减轻服务器端的压力

eg:各种软件

B/S:browser/server

特点:

  1. 程序员只需要开发服务端,客户端使用系统已有的浏览器即可
  2. 维护很简单,只需要维护服务端
  3. 所有的运算都在服务端

eg:各种网页

你可能感兴趣的:(网络编程)