Python全双工聊天

全双工聊天

全双工聊天:服务端和客户端都可以发送并接收信息。

使用select模块中的select方法

select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)

# server.py 服务器

from socket import *
from time import ctime
import select 
import sys

HOST = ''
PORT = 12346
BUFSIZE = 1024
ADDR = (HOST, PORT)

tcpServer = socket(AF_INET, SOCK_STREAM)
tcpServer.bind(ADDR)
tcpServer.listen(5)
gets = [tcpServer, sys.stdin]

while True:
    print('Waiting for connection...')
    tcpClient, addr = tcpServer.accept()
    print('Connected from:', addr)
    gets.append(tcpClient)

    while True:
        readyInput, readyOutput, readyException = select.select(gets, [], [])
        for indata in readyInput:
            if indata == tcpClient:  
                data = tcpClient.recv(BUFSIZE)
                if not data:
                    break
                print('[%s]: %s' % (ctime(), data.decode('utf-8')))
            else:
                data = input()
                if not data:
                    break
                tcpClient.send(bytes(data, 'utf-8'))
    tcpClient.close()
tcpServer.close()

 

# client.py 客户端

from socket import *
from time import ctime
import select 
import sys

HOST = 'localhost'
PORT = 12346
BUFSIZE = 1024
ADDR = (HOST, PORT)

tcpClient = socket(AF_INET, SOCK_STREAM)
tcpClient.connect(ADDR)
gets = [tcpClient, sys.stdin]

while True:
    readyInput, readyOutput, readyException = select.select(gets, [], [])
    for indata in readyInput:
        if indata == tcpClient:
            data = tcpClient.recv(BUFSIZE)
            if not data:
                break
            print('[%s]: %s' % (ctime(), data.decode('utf-8')))
        else:
            data = input()
            if not data:
                break
            tcpClient.send(bytes(data, 'utf-8'))
tcpClient.close()

 

转载于:https://www.cnblogs.com/noonjuan/p/10815259.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!非常感谢您的问题。在python中实现全双工聊天可以使用socket库来完成。具体的步骤如下: 1. 创建一个socket对象,并绑定要监听的IP地址和端口号。 2. 使用listen()方法开始监听传入连接请求。 3. 使用accept()方法接受客户端的连接请求,并为每个客户端创建一个新的线程来处理客户端请求。 4. 在每个客户端线程中,使用recv()方法从客户端接收数据,并使用send()方法向客户端发送响应数据。 以下是一个简单的Python全双工聊天示例代码: ``` import socket import threading # 定义要监听的IP地址和端口号 HOST = '0.0.0.0' PORT = 8000 # 创建socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((HOST, PORT)) server_socket.listen(5) print(f"Server started, listening on {HOST}:{PORT}") # 定义处理客户端请求的函数 def handle_client(client_socket): while True: # 接收客户端发送的数据 data = client_socket.recv(1024).decode('utf-8') print(f"Received message: {data}") if data.strip() == 'quit': # 如果收到quit命令则关闭客户端连接 client_socket.close() print(f"Client disconnected.") break # 向客户端发送响应数据 response = f"Received message: {data}" client_socket.send(response.encode('utf-8')) while True: # 等待客户端连接请求 client_socket, client_address = server_socket.accept() print(f"Client connected from {client_address}") # 创建新线程处理客户端请求 client_thread = threading.Thread(target=handle_client, args=(client_socket,)) client_thread.start() ``` 上述代码实现了一个简单的全双工聊天程序,当有客户端连接时,会创建一个新的线程处理客户端请求,线程会在接收到客户端消息后打印消息内容,并向客户端发送响应消息。当客户端发送quit命令时,线程会关闭客户端连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值