目录
网络编程(网络通信)
Socket
什么是Socket呢????
UDP
UDP协议发送数据:
URL(定义统一资源标识符)
TCP(传输控制协议)
三次握手
四次挥手
指编写运行在多个设备(计算机)的程序,将这些设备通过网络连接起来
服务器:是一台电脑,是一台低配(稳定)的电脑
客户端:是一台电脑,是手机,平板,网页。
建立在TCP/IP协议
Socket是网络编程接口,用来进行网络通信,客户端与服务器进行一次网络通信,肯定要建立连接,在建立连接时,客户端和服务器端会产生一个socket实例。客户端和服务器可以通过该实例进行信息的发送与接收。
Socket又称套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求。
Socket是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个socket实例。操作这个实例,完成所需的会话。
Socket允许程序员将网络连接看作是另外一个可以读写字节的流(既然是流,就肯定有两端)。
如何在网络环境下访问其他主机?
通过IP地址+端口号的形式访问其他主机
JAVA的socket类(客户端和服务器都可以使用),由ServerSocket类实现。
下面通过一个TCP/IP协议,通过两个类:Socket ServerSocket来进一步了解服务器端和客户端的发送数据和接收数据。
定义一个服务器类server、一个客户端client类。
public void server() throws IOException { }
public void client() throws IOException { }
在server中创建一个服务器对象serverSocket,绑定端口为:8888(通过IP地址+8888就可以访问该服务器)
// 创建了一个服务器对象,绑定在8888端口
ServerSocket serverSocket = new ServerSocket(8888);
创建完成之后,还需要调用accept,调用了accept就说明:服务器在等待客户端连接,有个返回值为Socket(客户端)
// 服务器在等待客户端连接
Socket socket = serverSocket.accept();
在client类中创建客户端
// 创建了一个Socket通信的客户端
Socket socket = new Socket();
在Socket中有一个方法叫做:connect(连接)。
修饰符和类型 | 方法 | 描述 |
void | connect(SocketAddress endpoint) | 将此套接字连接到服务器。 |
// 第一个参数就是获取当前电脑的IP地址
// 第二个参数就是服务器的端口号
socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(),8888));
传一个通信地址 (构造器里需要传入 IP地址 + 端口号
//客户端的端口号去找服务器端的端口号,就能连上了
先启动服务器,再启动客户端。
在客户端连上服务器端之后,可以通过客户端向服务器发数据(以IO流进行发送),现在服务器端要读取(输入流:getInputStream)客户端发来的信息。
// 读取客户端发送过来的信息
InputStream inputStream = socket.getInputStream();
byte [] buffer = new byte[1024 * 1024];
int len;
while((len = inputStream.read(buffer)) != -1){
System.out.println("服务器已接收客户端的数据:" + new String(buffer,0,len));
}
注意:不要忘记释放资源!!!!!先开的后关,后开的先关
// 释放资源
inputStream.close();
socket.close();//客户端连接
客户端发送(输出流:getOutputStream)数据给服务器
// 客户端发送数据给服务器
OutputStream outputStream = socket.getOutputStream();
String data = "hello server!";
outputStream.write(data.getBytes());
System.out.println("客户端已发送数据:" + data);
outputStream.close();
socket.close();
测试
首先启动服务器端
再启动客户端
UDP协议发送数据:
创建发送端socket对象
创建数据并把数据打包
调用socket对象的发送方法发送数据包
释放资源
类:DatagramSocket
此类表示用来发送和接收数据报包的套接字。
类:DatagramPacket此类表示数据报包。
public void send(DatagramPacket p):
从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、IP地址和端口号。
public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。
参数:
buf - 包数据。
length - 包长度。
address - 目的地址。
port - 目的端口号。
内容来自:https://blog.csdn.net/m0_38056893/article/details/80384311
传输端
@Test
public void client() throws IOException {
DatagramSocket socket = new DatagramSocket();
String str = "我通过UDP协议发送的消息...";
byte [] data = str.getBytes();
// 构建成了一个数据报文
// 第一个参数就是要发送的数据
// 第二个参数从哪开始发
// 第三个参数发多长
// 第四个参数指定服务器的ip地址
// 第五个参数是服务器的端口号
DatagramPacket packet = new DatagramPacket(data,0,data.length,
InetAddress.getLocalHost(),9999);
// 发送数据
socket.send(packet);
System.out.println("数据发送成功...");
socket.close();
}
接收端
public void server() throws IOException {
// 服务器指定端口号
DatagramSocket socket = new DatagramSocket(9999);
byte [] buffer = new byte[1024 * 1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
// 接收客户端发过来的数据
socket.receive(packet);
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}
是采用一种特定语法标识一个资源的字符串。
try {
url = new URL("https://192.168.1.1:8888/demo/list.html?usenrame=123&password=123456");
map.put("协议", url.getProtocol());
map.put("主机名称", url.getHost());
map.put("请求端口", url.getPort());
map.put("请求默认端口", url.getDefaultPort());
map.put("请求路径", url.getPath());
map.put("请求参数", url.getQuery());
map.put("请求文件", url.getFile());
map.put("认证信息", url.getAuthority());
map.put("用户信息", url.getUserInfo());
map.put("引用信息", url.getRef());
}
catch (MalformedURLException e) {
e.printStackTrace();
}
TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互, 以保证连接的可靠。
第一次握手,客户端向服务器端发出连接请求,等待服务器确认
第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求
第三次握手,客户端再次向服务器端发送确认信息,确认连接
完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。
举个栗子
运动会上教练 和 运动员“小运”打电话教练:你好!小运,听得到吗?(一次会话)
小运:听到了,教练,你能听到吗 (二次会话)
教练:听到了,赶紧来比赛 (开始会话)(三次会话)
再举个栗子
蒋丞和顾飞的对话
蒋丞:好的,那我先走了
顾飞:好的,那你走吧
顾飞:那我真走了?
蒋丞:好的!你走吧
第一次挥手:客户端发出连接释放报文,并且停止发送数据。释放数据报文首部
第二次挥手:服务器端接收到连接释放报文后,发出确认报文
第三次挥手:客户端接收到服务器端的确认请求后,客户端就会进入终止等待状态,等待服务器发送连接释放报文,服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了最后确认状态,等待客户端的确认。
第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认
解释来自:https://blog.csdn.net/m0_56649557/article/details/119492899