Socket是一种在计算机之间进行网络通信的方式,它提供了一个标准的网络通信接口,可以使不同操作系统和编程语言之间的应用程序进行通信。
在Python中,我们可以使用socket模块来创建Socket对象,通过套接字(Socket)来进行网络通信。
以下是一个简单的Socket编程示例,展示如何通过Socket实现一个简单的客户端-服务器通信程序:
基于TCP协议的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协议的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编程时,无法保证数据的可靠性和完整性,因此需要在程序设计时对数据的传输进行一定的处理和限制。