Python socket實現(xiàn)簡單聊天室
本文實例為大家分享了Python socket實現(xiàn)簡單聊天室的具體代碼,供大家參考,具體內容如下
服務端使用了select模塊,實現(xiàn)了對多個socket的監(jiān)控??蛻舳擞捎趕elect在Windows下只能對socket使用,所以使用了多線程來實現(xiàn)對客戶端輸入和socket連接的同時監(jiān)控。注意這里的socket設置為了非阻塞。這樣就實現(xiàn)了在一個線程中同時進行socket的接收和發(fā)送。
服務器代碼:
# -*- 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()
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
局域網(wǎng)內python socket實現(xiàn)windows與linux間的消息傳送
這篇文章主要介紹了局域網(wǎng)內python socket實現(xiàn)windows與linux間的消息傳送的相關知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-04-04
Python aiohttp百萬并發(fā)極限測試實例分析
這篇文章主要介紹了Python aiohttp百萬并發(fā)極限測試,結合實例形式分析了Python異步編程基于aiohttp客戶端高并發(fā)請求的相關操作技巧與使用注意事項,需要的朋友可以參考下2019-10-10
Python按行讀取文件的實現(xiàn)方法【小文件和大文件讀取】
這篇文章主要介紹了Python按行讀取文件的實現(xiàn)方法,結合實例形式分析了針對小文件和大文件的讀取方法,需要的朋友可以參考下2016-09-09
python3+pyqt5+itchat微信定時發(fā)送消息的方法
今天小編就為大家分享一篇python3+pyqt5+itchat微信定時發(fā)送消息的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
Eclipse和PyDev搭建完美Python開發(fā)環(huán)境教程(Windows篇)
這篇文章主要介紹了Eclipse和PyDev搭建完美Python開發(fā)環(huán)境教程(Windows篇),具有一定的參考價值,感興趣的小伙伴可以了解一下。2016-11-11

