Socket是一种在计算机之间进行网络通信的方式,它提供了一个标准的网络通信接口,可以使不同操作系统和编程语言之间的应用程序进行通信。
在Python中,我们可以使用socket模块来创建Socket对象,通过套接字(Socket)来进行网络通信。
以下是一个简单的Socket编程示例,展示如何通过Socket实现一个简单的客户端-服务器通信程序:
服务器端代码(server.py):
- import socket
-
- from socket import AF_INET
- # socket.socket() # AF_INET, type=SOCK_STREAM: 基于TCP协议的
-
- server=socket.socket(family=AF_INET, type=socket.SOCK_STREAM) # AF_INET, type=SOCK_DGRAM: 基于UDP协议的
-
- # 绑定IP地址和port
- server.bind(('127.0.0.1', 8000))
-
- # 服务端做监听,也称为是半链接池(服务端能够同时等待客户端的数量)
- server.listen(3)
-
- while True:
- # 该接收客户端发来的消息
- sock, addr = server.accept() # """我们知道代码运行到这里,就会卡主,等待客户端开发链接和发送消息"""
- """sock:当前链接的客户端的链接, addr:就是客户端的地址:ip,port"""
-
- while True:
- # 想拿到客户端实际发过来的数据
- try:
- """客户端发送过来的数据是个空,或者"""
- data=sock.recv(1024) # 接收的数据类型是bytes类型,二进制的 1024 代表接收的最多的字节数
- print("接收客户端的数据:",data)
- # 要给客户端返回一个数据
- sock.send(data.upper()) # 发送的数据是字节类型的
- except Exception as e:
- print(e)
- break
- # 关闭链接
- sock.close()
-
- server.close()
客户端代码(client.py):
- import socket
-
- from socket import AF_INET
-
- client=socket.socket(family=AF_INET, type=socket.SOCK_STREAM)
- # socket.socket()
-
- client.connect(('127.0.0.1', 8000))
-
- while True:
- send_data = input('请输入你要发送给服务端的数据:')
-
- # 开始给服务端发送消息
- client.send(send_data.encode('utf-8'))
-
- # 接收服务端发来的消息
- data=client.recv(1024)
- print("服务端发来的消息:", data)
-
- client.close()
此示例中,我们创建了一个简单的TCP/IP服务器和客户端来演示Socket编程的基本原理。服务器绑定到本地主机上的指定端口并等待来自客户端的连接请求。一旦连接建立,服务器收到客户端发送的数据并将其发送回去,直到连接关闭。客户端连接到服务器并发送一个简单的消息,等待并显示响应。
这只是Socket编程的一个基本示例,Socket提供了许多功能和选项,可用于更复杂的网络通信和应用程序。
UDP协议是一种面向无连接的传输协议,与TCP协议不同,UDP协议不需要在传输过程中建立连接并且不需要保证数据的可靠性。因此,在进行基于UDP协议的socket编程时,需要注意数据的可靠性和完整性。
以下是一个简单的基于UDP协议的socket程序,可以通过Python语言实现:
- """客户端"""
-
- import socket
-
- client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议-》UDP
-
- while True:
- msg = input('>>: ').strip() # msg=''
- client.sendto(msg.encode('utf-8'), ('127.0.0.1', 8080))
- data, server_addr = client.recvfrom(1024)
- print(data)
-
- client.close()
-
-
- """服务端"""
-
- import socket
-
- server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 数据报协议-》UDP
- server.bind(('127.0.0.1', 8080))
-
- while True:
- """client_addr: 客户端的地址"""
- data, client_addr = server.recvfrom(1024) # 接收的最大字节数
- print('===>', data, client_addr)
- server.sendto(data.upper(), client_addr)
-
- server.close()
在上面的程序中,我们使用socket
库中的socket
函数创建一个UDP协议的socket对象。然后,使用bind
方法将socket对象绑定到本地IP地址和端口号。接着,使用recvfrom
方法接收来自发送方的数据,并获取发送方的IP地址和端口号。程序将接收到的数据和发送方的信息打印出来。
随后,程序使用sendto
方法向发送方发送数据,并使用发送方的IP地址和端口号作为目标地址。最后,使用close
方法关闭socket对象。
需要注意的是,在进行UDP协议的socket编程时,无法保证数据的可靠性和完整性,因此需要在程序设计时对数据的传输进行一定的处理和限制。