python 6.0 TCP

本文介绍了一个使用Python实现的简单聊天室应用,通过socket编程和多线程技术,实现了客户端与服务器之间的实时通信。服务器端利用select函数进行多路复用,能够同时处理多个客户端的连接请求,客户端则通过两个线程分别负责发送和接收消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#! /usr/bin/python3.4

from socket import *
from time import ctime
import select
import queue
from time import sleep

host = '127.0.0.1'
port = 8888
buffsize = 2048
ADDR = (host,port)

server = socket(AF_INET,SOCK_STREAM)
server.bind(ADDR)
server.listen(5)
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 设置端口复用
inputs = [server]
outputs = []
message_queues = {}


while True:
	print('Waiting for the next event ...')
	readable,writeable,exceptional = select.select(inputs,outputs,inputs)# 设置监视
	#print('正在监听的socket对象%d' % (len(inputs)))
	for s in readable:# 监视可读信息
		if s == server:	# 有新用户连接
			client,addr = s.accept()	# 接受连接
			print("\033[35mConnection from :",addr,"\033[0m") # 打印对方信息
			client.setblocking(0)	#设置程序非阻塞
			inputs.append(client)	# 加入到输入列表中
		#	message_queues[client]=queue.Queue()

		else: # 有老用户发信息
			data = s.recv(buffsize).decode()# 接收信息
			if (data == 'quit' or data ==''):	# 如果data为quit
				print("\033[31mclosing ... ", s.getpeername(),"\033[0m")
				if s in outputs: # 如果在输出列表中
					outputs.remove(s) # 移出输出列表
				inputs.remove(s)  # 移出输入列表
				s.close()	# 关闭连接
			else:# 如果data不为空
				k=s.getpeername() # 得到发送方的信息
				print("\033[32mrecvData = ","%s" %(data),"[from" , k,"]\033[0m")
				data = "Thank for your message ..."
				s.send(data.encode())


    # 处理异常的情况
	for s in exceptional:
		print ('exception condition on', s.getpeername())

		inputs.remove(s)
		if s in outputs:
			outputs.remove(s)
		s.close()

    

client.close()

客户端:

#! /usr/bin/python3.4
from socket import *
import threading
import _thread
import time
import os

HOST ='127.0.0.1'

PORT = 8888

BUFFSIZE=2048

ADDR = (HOST,PORT)

client = socket(AF_INET,SOCK_STREAM)

client.connect(ADDR)


def sendData():
	while True:
		print("\033[32msendData = " ,end = '')
		data = input()
		print("\033[0m",end='')	
		client.send(data.encode())
		if  data == 'quit':
			print("\033[31mexiting for you ... \033[0m\n")
			os._exit(0)
		time.sleep(1)

def recvData():
	while True:
		data = client.recv(BUFFSIZE).decode()
		print("\033[33mrecvData = ","%s\033[0m" %(data))
		if not data:
			continue



def main():
	s2=threading.Thread(target=recvData,name='')#创建接收数据的线程
	s1=threading.Thread(target=sendData,name='')#创建发送数据的线程
	s2.start()#运行线程
	s1.start()#运行线程



if __name__ == '__main__':
	main()

运行效果图:

服务器:

客户端:

 

用CTRL_C退出的时候服务器也会显示closing ....(data == ' '时)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值