基于TCP的聊天室通信
服务端:
import socket
# 1. 创建一个socket对象
server = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
# 2. 绑定IP和端口,供客户端连接
server.bind(('172.25.254.67',5000))
# 3. 监听是否有客户端连接
server.listen(5)
print('服务端正在启动......')
# 4. 接收客户端的连接
clientSocket,clientAddress = server.accept()
print('客户端地址:',clientAddress)
while True:
# 5. 接收客户端发送的消息
recvData = clientSocket.recv(1024)
print('服务端接收的消息:',recvData.decode('utf-8'))
# 6. 给客户端回复消息
sendData = input('server:>> ')
if not sendData:
continue
if sendData == 'quit':
print('聊天结束......')
break
clientSocket.send(sendData.encode('utf-8'))
# 7.关闭socket对象
server.close()
clientSocket.close()
客户端:
import socket
# 1. 创建一个socket对象
client = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
# 2. 连接服务端
client.connect(('172.25.254.67',5000))
while True:
# 3. 给服务端回复消息
sendData = input('client:>> ')
if not sendData:
continue
if sendData == 'quit':
print('聊天结束......')
break
client.send(sendData.encode('utf-8'))
# 4. 接收客户端发送的消息
recvData = client.recv(1024)
print('客户端接收的消息:',recvData.decode('utf-8'))
# 5.关闭socket对象
client.close()
分别运行服务端和客户端,双方开始通信:
基于多线程TCP的通信
服务端:
import os
import socket
import threading
def get_client_conn(clientSocket,clientAddress):
while True:
# 5. 接收客户端发送的消息
recvData = clientSocket.recv(1024).decode('utf-8')
# 接收消息时,需要将消息decode解码为str类型
print('服务端接收的消息:',recvData,'\n')
# 6. 给客户端回复消息; send()发送的消息需要encode编码成为bytes类型
# os.system不能保存命令的执行结果,os.popen实现shell命令
sendData = os.popen(recvData).read()
clientSocket.send(sendData.encode('utf-8'))
clientSocket.close()
# 1. 创建一个socket对象
# family指定使用IP协议的版本 -> IPV4:AF_INET,IPV6:AF_INET6
# type指定传输层使用的协议类型 -> TCP(SOCK_STREAM),UDP(SOCK_DGRAM)
server = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
# 2. 绑定一个IP和端口,供客户端来连接
server.bind(('172.25.254.67',7000))
# 3. 监听是否有客户端连接
server.listen(5)
print('服务端正在启动......')
while True:
# 4. 接收客户端的连接; accept() -> (socket object, address info)
clientSocket,clientAddress = server.accept()
print('客户端地址:',clientAddress)
t = threading.Thread(target=get_client_conn,args=(clientSocket,clientAddress))
t.start()
# 7.关闭socket对象
server.close()
客户端(进行实验时多写几个客户端实现多线程,此处写两个客户端看实验效果):
import socket
# 1. 创建一个socket对象
client = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
# 2. 连接服务端
client.connect(('172.25.254.67',7000))
while True:
# 3. 给服务端回复消息
sendData = input('client:>> ')
if not sendData:
continue
if sendData == 'quit':
print('聊天结束......')
break
client.send(sendData.encode('utf-8'))
# 4. 接收客户端发送的消息
recvData = client.recv(1024)
print('客户端接收的消息:',recvData.decode('utf-8'))
# 5.关闭socket对象
client.close()
启动服务端:
运行第一个客户端,并向服务端发送命令,服务端向客户端返回命令结果:
运行第二个客户端,并向服务端发送命令,服务端向客户端返回命令结果:
服务端接收到的命令:
基于多线程UDP的通信与TCP类似(多进程也可以实现)