socket实现聊天室通信

基于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类似(多进程也可以实现)

猜你喜欢

转载自blog.csdn.net/King15229085063/article/details/86679861
今日推荐