这篇文章将为大家详细讲解有关Python中socket如何实现简单聊天室,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

具体内容如下
服务端使用了select模块,实现了对多个socket的监控。客户端由于select在Windows下只能对socket使用,所以使用了多线程来实现对客户端输入和socket连接的同时监控。注意这里的socket设置为了非阻塞。这样就实现了在一个线程中同时进行socket的接收和发送。
服务器代码:
# -*- coding: utf-8 -*-
import socket,select
connection_list = []
host = ''
port = 10001
def board_cast(sock,message):
for socket in connection_list:
if socket != server_sock and socket != sock:
try:
socket.send(message)
except:
socket.close()
print str(socket.getpeername())+' is offline'
connection_list.remove(socket)
server_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server_sock.setblocking(0)
server_sock.bind((host,port))
server_sock.listen(10)
connection_list.append(server_sock)
while 1:
readable,writable,error = select.select(connection_list,[],[])
for sock in readable:
if sock == server_sock:
connection,connection_add = sock.accept()
message = str(connection_add)+'enter room'
board_cast(connection,message)
print connection_add,'%s connect'
connection_list.append(connection)
else:
try:
date = sock.recv(1024)
print date
board_cast(sock,'('+str(sock.getpeername())+') :'+date)
except:
message2 = str(sock.getpeername())+ 'is offline'
board_cast(sock,message2)
print str(sock.getpeername())+ ' is offline'
sock.close()
connection_list.remove(sock)
continue客户端代码:
# -*- coding: utf-8 -*- import socket,threading,time flag = 0 date = '' lock = threading.Lock() host = 'localhost' port = 10001 client_sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) client_sock.setblocking(0) class Mythread1(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): global flag, date while 1: date = raw_input() if len(date): lock.acquire() flag = 1 lock.release() class Mythread2(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): global flag global date while 1: try: buf = client_sock.recv(1024) if len(buf): print buf except: pass if flag: try: client_sock.send(date) except socket.error, e: print e lock.acquire() flag = 0 lock.release() try: client_sock.connect((host,port)) print"连接成功" except socket.error,e: print e t1 = Mythread1() t2 = Mythread2() t1.start() t2.start()
关于“Python中socket如何实现简单聊天室”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。