概述
常见计算机网络
- 互联网 : 点与点相连
- 万维网: 端与端相连
- 物联网:物与物相连
- 网络编程: 让计算机与计算机之间建立、进行通信
网络通信协议
通过计算机?络可以使多台计算机实现连接,位于同?个?络中的计算机在进?连接和通信时需要遵守?定的规则,这就好?在道路中?驶的汽??定要遵守交通规则?样。在计算机?络中,这些连接和通信的规则被称为?络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统?规定,通信双?必须同时遵守才能完成数据交换。
网络模型
OSI参考模型
OSI(Open System Interconnect),即开放式系统互联。
- 是ISO组织在1985年研究的?络互联模型。
- 该体系结构标准定义了?络互联的七层框架(物理层、数据链路层、?络层、传输层、会话层、表
示层和应?层)。
每层功能:
- 第?层:物理层为设备之间的数据通信提供传输信号和物理介质。(双绞线、光导纤维)。
- 第?层:链路层在物理层上,通过规程或协议(差错控制)来控制传输数据的正确性。(MAC)。
- 第三层:?络层负责定义了能够标识所有?络节点的逻辑地址。(IP地址)。
- 第四层:传输层负责是否选择差错恢复协议、数据流重?、错误顺序重排。(TCP、UDP)
- 第五层:会话层负责使应?建?和维持会话,使通信在失效时继续恢复通信。(断点续传)
- 第六层:表示层负责定义转换数据格式及加密,允许选择以?进制或ASCII格式传输。
- 第七层:应?层负责?件访问和管理、可靠运输服务、远程操作服务。(HTTP、FTP、SMTP)。
TCP/IP模型
- TCP/IP模型是因特?使?的参考模型,基于TCP/IP的参考模型将协议分成四个层次。
- 该模型中最重要的两个协议是TCP和IP协议。
上图中,TCP/IP协议中的四层分别是应?层、传输层、?络层和链路层,每层分别负责不同的通 信功能。 链路层:链路层是?于定义物理传输通道,通常是对某些?络连接设备的驱动协议,例如针对光 纤、?线提供的驱动。 ?络层(?速公路):?络层是整个TCP/IP协议的核?,它主要?于将传输的数据进?分组,将 分组数据发送到?标计算机或者?络。 运输层(卡?):主要使?络程序进?通信,在进??络通信时,可以采?TCP协议,也可以采 ?UDP协议。 应?层(货物):主要负责应?程序的协议,例如HTTP协议、FTP协议等。
网络编程
UDP和TCP
UDP: ?户数据报协议(User Datagram Protocol)。UDP是?连接通信协议,即在数据传输时,数据的 发送端和接收端不建?逻辑连接。简单来说,当?台计算机向另外?台计算机发送数据时,发送端不会 确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
由于使?UDP协议消耗资源?,通信效率?,所以通常都会?于?频、视频和普通数据的传输例如视频 会议都使?UDP协议,因为这种情况即使偶尔丢失?两个数据包,也不会对接收结果产?太?影响。
TCP: 传输控制协议 (Transmission Control Protocol)。TCP协议是?向连接的通信协议,即传输数据 之前,在发送端和接收端建?逻辑连接,然后再传输数据,它提供了两台计算机之间可靠?差错的数据 传输。
在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要 经过“三次握?”。
三次握?:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可 靠。
- 第?次握?,客户端向服务器端发出连接请求,等待服务器确认
- 第?次握?,服务器端向客户端回送?个响应,通知客户端收到了连接请求。
- 第三次握?,客户端再次向服务器端发送确认信息,确认连接。整个交互过程如下图所示。
TCP/UDP区别:
TCP(传输控制协议,Transmission Control Protocol):(类似打电话)?向连接、传输可靠(保证数 据正确性)、有序(保证数据顺序)、传输?量数据(流模式)、速度慢、对系统资源的要求多,程序 结构较复杂,每?条TCP连接只能是点到点的,TCP?部开销20字节。
UDP(?户数据报协议,User Data Protocol):(类似发短信)?向?连接 、传输不可靠(可能丢 包)、?序、传输少量数据(数据报模式)、速度快,对系统资源的要求少,程序结构较简单 ,UDP? 持?对?,?对多,多对?和多对多的交互通信,UDP的?部开销?,只有8个字节。
网络编程三要素
协议
- 计算机?络通信必须遵守的规则,已经介绍过了,不再赘述。
IP地址
端口号
?络的通信,本质上是两个进程(应?程序)的通信。每台计算机都有很多的进程,那么在?络通信 时,如何区分这些进程呢?
如果说IP地址可以唯?标识?络中的设备,那么端?号就可以唯?标识设备中的进程(应?程序)了。
端?号:?两个字节表示的整数,它的取值范围是065535。其中,01023之间的端?号?于?些 知名的?络服务和应?,普通的应?程序需要使?1024以上的端?号。如果端?号被另外?个服务 或应?所占?,会导致当前程序启动失败。
利? 协议 + IP地址 + 端?号 三元组合,就可以标识?络中的进程了,那么进程间的通信就可以利?这 个标识与其它进程进?交互。
TCP编程
概述 TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端 (Server)
两端通信步骤 1、服务端程序,需要事先启动,等待客户端的连接 2、 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。
TCP通信程序 1、客户端: java.net.Socket 类表示。创建 Socket 对象,向服务端发出连接请求,服务端响应 请求,两者建?连接开始通信。 2、服务端:java.net.ServerSocket 类表示。创建 ServerSocket 对象,相当于开启?个服 务,并等待客户端的连接。
开发步骤:
- 建?通信连接(会话):
- 创建ServerSocket,指定端?号。
- 调?accept等待客户端接?。
- 客户端请求服务器:
- 创建Socket,指定服务器IP + 端?号。
- 使?输出流,发送请求数据给服务器
- 使?输?流,接收响应数据到客户端(等待)
- 服务器响应客户端。
- 使?输?流,接收请求数据到服务器(等待)
- 使?输出流,发送响应数据给客户端。
客户端向服务器发送数据
服务端实现:
public class ServerTCP {
public static void main(String[] args) throws IOException {
System.out.println("服务端启动 , 等待连接 .... ");
ServerSocket ss = new ServerSocket(6666);
Socket server = ss.accept();
InputStream is = server.getInputStream();
byte[] b = new byte[1024];
int len = is.read(b);
String msg = new String(b, 0, len);
System.out.println(msg);
is.close();
server.close();
}
}
客户端实现:
public class ClientTCP {
public static void main(String[] args) throws Exception {
System.out.println("客户端 发送数据");
Socket client = new Socket("localhost", 6666);
OutputStream os = client.getOutputStream();
os.write("你好么? tcp ,我来了".getBytes());
os.close();
client.close();
}
}
服务器向客户端回写数据
服务端实现:
public class ServerTCP {
public static void main(String[] args) throws IOException {
System.out.println("服务端启动 , 等待连接 .... ");
ServerSocket ss = new ServerSocket(6666);
Socket server = ss.accept();
InputStream is = server.getInputStream();
byte[] b = new byte[1024];
int len = is.read(b);
String msg = new String(b, 0, len);
System.out.println(msg);
OutputStream out = server.getOutputStream();
out.write("我很好,谢谢你".getBytes());
out.close();
is.close();
server.close();
}
}
客户端实现:
public class ClientTCP {
public static void main(String[] args) throws Exception {
System.out.println("客户端 发送数据");
Socket client = new Socket("localhost", 6666);
OutputStream os = client.getOutputStream();
os.write("你好么? tcp ,我来了".getBytes());
InputStream in = client.getInputStream();
byte[] b = new byte[100];
int len = in.read(b);
System.out.println(new String(b, 0, len));
in.close();
os.close();
client.close();
}
}
UDP编程
主要?到两个类DatagramPacket和DatagramSocket,下?分别介绍。
DatagramSocket:
此类表示?来发送和接收数据报包的套接字。
构造?法:
- DatagramSocket(int port) ~创建数据报套接字并将其绑定到本地主机上的指定端?
- DatagramSocket(int port, InetAddress laddr) ~创建数据报套接字,将其绑定到指定的本地地址。
DatagramPacket 此类表示数据报包。 两个都要先构造好相应的数据包(java.net.DatagramPacket)。 在DatagramPacket包中的函数 int getLength()返回实际接受的字节数。
客户端1
public class Client1 {
public static void main(String[] args) throws IOException {
System.out.println("客户端1启动。。。。");
DatagramSocket socket = new DatagramSocket(8888);
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data,data.length);
socket.receive(packet);
String msg = new String(data, 0, packet.getLength());
System.out.println("客户端2:"+msg);
byte[] data2 = "你好,我是客户端1".getBytes();
InetAddress localhost = InetAddress.getByName("localhost");
int port = 9999;
DatagramPacket packet2 = new
DatagramPacket(data2,data2.length,localhost,port);
socket.send(packet2);
socket.close();
}
}
客户端2
public class Client2 {
public static void main(String[] args) throws IOException {
System.out.println("客户端2启动。。。。。");
DatagramSocket socket = new DatagramSocket(9999);
InetAddress localhost = InetAddress.getByName("localhost");
int port = 8888;
byte[] data = "你好,客户端1".getBytes();
DatagramPacket packet = new
DatagramPacket(data,data.length,localhost,port);
socket.send(packet);
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2,data2.length);
socket.receive(packet2);
String msg = new String(data2, 0, packet2.getLength());
System.out.println("客户端1:"+msg);
socket.close();
}
}
|