以下是“Python基于socket实现TCP客户端和服务端”的完整攻略:
什么是Socket以及TCP/IP协议?
- Socket:Socket是通信两端建立连接所用的一个对象,可以用来发送和接收数据。
- TCP/IP协议:TCP/IP协议是Internet网络协议的基础,它定义了数据如何从一个计算机传输到另一个计算机,并规定了各种服务的标准规范。
Python中Socket模块的使用
Python提供了支持网络编程的socket模块,通过这个模块我们可以实现客户端和服务端之间的数据交互。下面,我们来简要了解一下:
-
服务器端执行流程:
- 创建一个socket对象;
- 绑定到一个IP地址和端口号;
- 监听连接请求;
- 接受客户端的连接请求;
- 接收客户端发送的数据,并发送响应数据;
- 关闭连接。
-
客户端执行流程:
- 创建一个socket对象;
- 连接到服务器;
- 发送请求数据;
- 接收服务器返回的响应数据;
- 关闭连接。
示例1:基于Socket实现简单的TCP客户端和服务端
服务器端代码实现:
import socket
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名称
host = socket.gethostname()
# 设置一个端口号
port = 9999
# 绑定端口号和主机
server_socket.bind((host, port))
# 设置监听数量
server_socket.listen(5)
# 等待客户端连接请求
while True:
# 建立客户端连接
client_socket, addr = server_socket.accept()
print("Got a connection from %s" % str(addr))
msg = 'Welcome to the server!'
# 向客户端发送消息
client_socket.send(msg.encode('utf-8'))
# 关闭连接
client_socket.close()
客户端代码实现:
import socket
# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名称
host = socket.gethostname()
# 设置一个端口号
port = 9999
# 连接服务,指定主机和端口
client_socket.connect((host, port))
# 接收小于 1024 字节的数据
msg = client_socket.recv(1024)
client_socket.close()
print(msg.decode('utf-8'))
在这里,我们开启了一个服务器程序,并且在客户端向服务器发送一个连接请求后,服务器向客户端发送一条欢迎消息。
示例2:基于Socket实现在线聊天室服务端
服务器端代码实现:
import socket
import threading
class Server:
def __init__(self, host, port):
# 创建 socket 对象
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口号和主机
self.server_socket.bind((host, port))
# 设置监听数量
self.server_socket.listen(10)
print("Server started on port %s" % str(port))
self.clients = []
def start(self):
while True:
client, address = self.server_socket.accept()
client.send("Welcome to the chat room!".encode())
self.clients.append(client)
threading.Thread(target=self.client_thread, args=(client, address)).start()
def client_thread(self, client, address):
while True:
try:
msg = client.recv(1024).decode()
self.broadcast(msg, client)
except:
print("Disconnected: %s:%s" % address)
client.close()
break
def broadcast(self, msg, sender):
for client in self.clients:
if client != sender:
try:
client.send(msg.encode())
except:
client.close()
self.clients.remove(client)
host = socket.gethostname()
port = 9000
s = Server(host, port)
s.start()
客户端代码实现:
import socket
import threading
class Client:
def __init__(self, host, port):
# 创建 socket 对象
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务,指定主机和端口
self.client_socket.connect((host, port))
# 接收小于 1024 字节的数据
print(self.client_socket.recv(1024).decode())
threading.Thread(target=self.receive).start()
def receive(self):
while True:
try:
msg = self.client_socket.recv(1024).decode()
if msg:
print(msg)
except:
print("Error receiving message")
self.client_socket.close()
break
def send(self):
while True:
message = input()
self.client_socket.send(message.encode())
host = socket.gethostname()
port = 9000
c = Client(host, port)
c.send()
在这个聊天室示例中,我们开启了一个服务器进程,当客户端连接到服务器时,服务器会向客户端发送一条欢迎消息,并将该用户加入客户端列表。当任意一个客户端发送消息时,该消息就会被广播到该聊天室中所有在线的客户端。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python基于socket实现TCP客户端和服务端 - Python技术站