Python中的TCP示例详解
在Python中,使用TCP/IP协议进行网络通信非常常见。本篇文章将结合两个简单的例子,详细讲解Python中如何使用TCP协议进行通信。
示例一:客户端与服务端的基本交互
首先,我们需要了解socket
模块。在Python中,socket
模块提供了构建网络应用程序所需的基础设施。具体可以通过以下代码引入socket
模块:
import socket
接下来,我们将创建一个简单的客户端程序,连接到指定的服务器。客户端会发送一条消息给服务器,然后等待服务器的回复。以下是基本示例代码:
import socket
HOST = 'localhost'
PORT = 8888
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
在以上代码中,socket.AF_INET
表示使用IPv4协议,socket.SOCK_STREAM
表示使用流式TCP协议。s.connect((HOST, PORT))
方法表示连接到指定的服务器,端口号为8888。s.sendall(b'Hello, world')
表示向服务器发送一条消息。接着,客户端等待服务器的回复,收到消息后将其打印出来。
接下来,我们将创建一个简单的服务器程序,接收客户端的消息并给出回复。以下是基本示例代码:
import socket
HOST = 'localhost'
PORT = 8888
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
在以上代码中,s.bind((HOST, PORT))
方法表示指定服务器的IP地址和端口号。s.listen(1)
表示监听客户端的请求,最大允许连接数为1。conn, addr = s.accept()
方法表示等待客户端的连接请求,然后建立连接。conn.recv(1024)
方法表示接收客户端发送的消息,conn.sendall(data)
方法表示向客户端发送回复消息。当客户端没有发送消息时,服务端程序退出循环。
以上代码可通过使用python3
命令运行,模拟客户端和服务端进行简单的交互。
示例二:使用Python实现聊天室
假设你需要实现一个简单的聊天室,可以通过以下示例代码实现。
import socket
import threading
class Server:
def __init__(self, host, port):
self.host = host
self.port = port
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind((self.host, self.port))
self.server_socket.listen(5)
self.clients = []
def broadcast(self, message, sender):
for client in self.clients:
if client != sender:
client.send(message)
def handle(self, client):
while True:
try:
message = client.recv(1024)
if message:
message = "{}: {}".format(client.getpeername(), message.decode())
print(message)
self.broadcast(message, client)
else:
self.remove(client)
except:
self.remove(client)
break
def remove(self, client):
if client in self.clients:
self.clients.remove(client)
def run(self):
print("Server started on {}:{}".format(self.host, self.port))
while True:
client, address = self.server_socket.accept()
print("{} connected.".format(str(address)))
self.clients.append(client)
client.send("Welcome to the chatroom! Please enter your name.".encode())
thread = threading.Thread(target=self.handle, args=(client,))
thread.daemon = True
thread.start()
class Client:
def __init__(self, host, port, name):
self.host = host
self.port = port
self.name = name
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def connect(self):
self.sock.connect((self.host, self.port))
def send_message(self, message):
self.sock.sendall("{}: {}".format(self.name, message).encode())
def receive_message(self):
while True:
try:
message = self.sock.recv(1024)
if message:
print(message.decode())
except:
print("Error Occured.")
self.sock.close()
break
if __name__ == "__main__":
mode = input("Enter 's' for Server, 'c' for Client: ")
if mode == "s":
server = Server("localhost", 8888)
server.run()
else:
client_name = input("Enter your name: ")
client = Client("localhost", 8888, client_name)
client.connect()
receive_thread = threading.Thread(target=client.receive_message)
receive_thread.daemon = True
receive_thread.start()
while True:
message = input()
if message.lower() == 'quit':
break
client.send_message(message)
以上代码可以通过以下两种方法运行:
- 作为服务器程序运行:在终端输入
python3 chatroom.py
并按回车键,然后输入s
,即可将Python程序作为服务器程序运行。 - 作为客户端程序运行:在终端输入
python3 chatroom.py
并按回车键,则进入客户端模式,可以输入用户名并进行聊天。在聊天过程中,可以随时在命令行输入'quit'退出程序。
以上述代码为基础,你还可以添加更多的功能,来实现更完善的聊天室应用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中的tcp示例详解 - Python技术站