JavaSE第九章——网络编程
文章目录
网络编程概述
1、计算机网络
把分布在不同地理区域的具有独立功能的计算机,通过通信设备,网线连接起来,实现在不同的计算机之间的资源共享,信息互通。
2、网络编程语言
我们所编写的程序具备在网络间进行信息传递,Java是支持网络通信,将底层实现细节封装起来。
3、网络通信:
如何找到计算机网络中的某台主机(IP)
找到主机后如何可靠安全高效数据传输(通信协议)
IP:计算机地址
端口:给计算机上运行的程序分配编号——端口号(是不重复的)
IP+端口号
网络编程的目的是直接或间接地通过网络协议与其他计算机进行通讯。
通讯要素:IP和端口号
IP地址
:InetAddress,公网地址(万维网使用)和私有地址(局域网使用),192.168.
开头的就是私有址址,范围即为192.168.0.0-192.168.255.255,专门为组织机构内
部使用
端口号:
标识正在计算机上运行的进程(程序)
不同的进程有不同的端口号
端口分类:
公认端口:0~1023,被预先定义的服务通信占用
注册端口:1024~49151,分配给用户进程或应用程序。
动态私有端口:49152~65535
端口号与IP地址的组合得出一个网络套接字
通讯要素:网络通信协议
网络通信协议:
计算机网络中实现通信必须有一些约定,即通信协议,对速率。传输代码、代码结构、传输控制步骤、出错控制等制定标准
通信协议分层的思想
由于结点之间联系很复杂,在制定协议时,把复杂成份分解成一些简单
的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可
以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影
响,利于系统的开发和扩展。
**TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)**而得名,
实际上是一组协议,包括多个具有不同功能且互为关联的协议。
IP(Internet Protocol)协议是网络层的主要协议,支持网间互连的数据通信
TCP协议
使用TCP协议前,需先建立TCP连接,形成传输数据通道
传输前,采用三次握手的方式,是可靠的
TCP协议进行通信的两个应用进程:客户端、服务端
在连接中可以进行大数据量的传输
传输完毕,需释放已建立的连接,效率低
在断开是要进行四次挥手
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HhtXtHj2-1624967876544)(C:\Users\辉欲静,而风止。\Desktop\TCP协议.png)]
UDP:
将数据、源、目的封装城数据包,不需要建立连接
每个数据报的大小限制在64k内
因无需连接,故是不可靠的
发送数据结束时无序释放资源,速度快
Socket
通信的两端都要有Socket,是两台机器间通信的端点
网络通信其实就是Socket间的通信
Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输
一般主动发起通信的应用程序属客户端,等待通信请求的为服务端
Socket常用方法
方法 | 功能 |
---|---|
void close() throws IOException | 关闭Socket,不可在以后的网络连接中,除非创建新的套接字 |
InputStream getInputStream() throws IOException | 获取与Socket相关联的字节输入流,用于从Socket中读取数据 |
OutputStream getOutputStream() throws IOException | 获取与Socket相关联的字节输出流,用于向Socket中写数据 |
//服务器端
Public class Server{
//启动服务器端程序
public static void main(String[] args){
ServerSocket serverSocket = new ServerSocket(端口);
sout("服务器启动成功,等待客户端连接");
//监听
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功");
InputStream in = socket.getInputStream()
byte[] b = new byte[100];//创建一个数组用来接收从客户端发送的数据
int length = in.read(b);//读取
String msg = new String(b,0,length,"utf-8");
System.out.println("客户端说"+msg);
}
}
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
//启动客户端
public static void main(String[] args) throws IOException {
Socket socket = new Socket("IP地址",端口号);
OutputStream out = socket.getOutputStream();
out.write("今天又是元气满满的一天".getBytes("utf-8"));
}
}
服务器程序的工作过程包含以下四个基本步骤:
1、调用ServerSocket(int port):创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
2、调用accept():监听连接请求,如果客户端请求连接,则接连接,返回通信套接字对象
3、调用该Socket类对象的getOutputStream()和getInputStream():获取输出流和输入流,开始网络数据的发送和接收。
4、关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
服务器建立ServerSocket对象
ServerSocket对象负责等待客户端请求建立套接字连接,服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象。所谓‘’接收‘’客户套接字的请求,就是accept()方法会返回一个Socket对象。
//接收消息
ServerSocket ss = new ServerSocket(端口号);
Socket s = ss.accept();//监听
InputStream in = s.getInputStream();//接收从客户端传来的请求
byte[] b = new byte[1024];//将接受过来的数据存进byte数组
int length = in.read(b);
String str = new String(b,0,length,"utf-8");
sout(str);
s.close();
ss.close();
UDP网络通信
类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序。
UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
UDP协议中每个数据包都给出了完整的地址信息,因此无需建立发送方和接收方的连接
流程:
1、DatagramSocket与DatagramPacket
2、建立发送端接收端
3、建立收据报
4、调用Socket的发送、接收方法
5、关闭Socket
发送端和接收端是两个独立运行的程序
发送端
DatagramSocket ds = new DatagramSocket();
String msg = "你好静静";
byte[] b = msg.getBytes(编码格式utf-8);
//发送端数据报,在数据报中写数组、数组长度、IP地址、端口号
DatagramPacket dp = new DatagramPacket(b,b.length,InetAddress.getByName("IP地址"),端口号);
ds.send(dp);//发送消息
接收端,要指定监听的端口。
DatagramSocket ds = new DatagramSocket(端口号);
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b,b.length);
ds.receive(dp);//接收消息
//String(数组,数组起始,dp.getLength()数组长度,编码格式:"utf-8")
String msg = new String(b,0,dp.getLength(),"utf-8");
System.out.println(msg);
[1024];
DatagramPacket dp = new DatagramPacket(b,b.length);
ds.receive(dp);//接收消息
//String(数组,数组起始,dp.getLength()数组长度,编码格式:“utf-8”)
String msg = new String(b,0,dp.getLength(),“utf-8”);
System.out.println(msg);