UDP协议
用户数据报协议:UDP协议是一个面向无连接的协议。传输数据时,不需要建立连接,不管对方服务器是否启动。直接将数据、数据源和目的地都封装在数据包中,直接发送。每个数据包的大小限制在64k以内。它是不可靠协议,因为无连接,所以传输速度快,但是容易丢失数据。日常应用中,例如视频会议、QQ聊天等。
网络编程程序的分类
1.B/S程序: 浏览器与服务器程序
2.C/S程序: 客户端与服务器程序
TCP协议-OSI网络模型
指的是从一台计算机的软件中,将数据发送到另一台计算机的软件中的过程。
七层网络模型:应用层/表现层/会话层/传输层/网络层/数据链路层/物理层
三次握手和四次挥手熟悉
tcp协议客户端与服务器连接时,存在三次握手操作,确保消息能准确无误的发送。断开连接时,存在四次挥手操作。
TCP协议的C/S程序
需要使用到两个类,来编写TCP协议的cs程序 。
1.ServerSocket
2.Socket搭建客户端
两方使用socket(套接字,通信端点)进行交流。
ServerSocket(服务器)
用于创建服务器,创建完毕后,会绑定一个端口号
然后此服务器可以等待客户端连接
每连接一个客户端。服务器就会得到一个新的Socket对象,用于跟客户端通信。
常用构造方法:
ServerSocket(int port);****
创建一个基于TCP/IP协议的服务器,并绑定指定端口号。
注意:参数port的范围是:0-65535(建议1025-65535)。
常用方法:
Socket accept();****
等待客户端连接,
此方法会导致线程的阻塞!
直到一个新的客户端连接成功,return Socket对象后,线程再继续执行。
void close();
释放占用的端口号,关闭服务器。
Socket(套接字)
是两台计算机之间通信的端点,是网络驱动提供给应用程序编程的一种接口,一套标准,一种机制。
构造方法:
Socket(Stirng ip,int port) ****
创建一个套接字,并连接指定ip和端口号的服务器。
参数1. 服务器的ip地址
参数2. 服务器软件的端口号
常用方法:
-OutputStream getOutputStream();
返回的是,指向通信的另一端点的输出流
-InputStream getInputStream();
返回的是,指向通信的另一端点的输入流
-void close();
关闭套接字
注意:在网络编程中,获取输入输出流的操作,对于客户端和服务器来说是相对的。
客户端的输入流,输入的是服务器的输出流 输出的内容。
客户端的输出流,输出到了服务器的输入流中。
所以在使用时,需要注意一下规则:
客户端与服务器获取流的顺序必须相反
例如:客户端先得到了输入流,服务器必须先获取输出流。
代码案例:
//服务器代码
public static void main(String[] args) throws IOException{
//搭建服务器
ServerSocket server = new ServerSocket(55565);
System.out.println(“服务器启动完毕”);
//等待客户端的连接
Socket socket = server.accept();
System.out.println(“一个客户端连接了”);
//建立输出流
OutputStream os = socket.getOutputStream();
//将输出流转换为打印流
PrintStream ps = new PrintStream(os);
ps.println(“欢迎你连接服务器”);
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.println(“服务器收到客户端的回复”+text);
System.out.prrintln(“服务器程序执行结束”);
}
//客户端代码
public static void main(String[] args) throws IOException{
//连接服务器
Socket socket = new Socket(“localhost”,55565);
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String text = br.readLine();
System.out.println(“客户端接到消息”+text);
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.print(“服务器你好”);
//多线程服务器
//使用while循环连接多台客户端
while(true){
Socket socket = server.accept();
//当接收客户端连接时花费了10分钟。那么线程就会阻塞10分钟。
//此时可以单独开条线程,每连接一台客户端就开一条单独的线程。
new Thread(){
try{
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
}catch(IOException e){
e.printStackTrace();
}
}.start();
System.out.println(“一个客户端连接了”);
}