龙空技术网

Python socket编程打造多人聊天室

精彩播客 494

前言:

而今姐妹们对“python局域网聊天室”都比较珍视,同学们都需要剖析一些“python局域网聊天室”的相关内容。那么小编在网络上搜集了一些有关“python局域网聊天室””的相关内容,希望你们能喜欢,各位老铁们一起来学习一下吧!

今天我们的任务是基于python打造一个多人聊天室。

聊天室的设计思想是 :在局域网下, 利用socket进行连接通信,当服务器端启动的时候,利用Thread线程不停的等待客户端的链接;当有客户端开启连

接的时候,服务器端通过IO流反馈“上线用户”信息给客户端,客户端也使用线程不停的接收服务器的信息,从而实现多人在线聊天功能。

编写服务器端程序:

# -*-coding:utf-8-*-#服务端import socketimport threadingdef clientThreadIn(conn,nick):  global data while True: try: temp = conn.recv(1024)#客户端发过来的消息 if not temp: conn.close() return NotifyAll(temp) print data except: NotifyAll(nick+'leaves the room')#出现异常就退出 print data returndef clientThreadOut(conn,nick): global data while True: if con.acquire(): con.wait()#堵塞,放弃对资源的占有 等待通知运行后面的代码 if data: try: conn.send(data) con.release() except: con.release returndef NotifyAll(ss): global data if con.acquire():#获取锁 data = ss con.notifyAll()#当前线程放弃对资源的占有,通知所有等待x线程 con.release()con = threading.Condition()#条件Host = raw_input('input the server ip address:')# ip地址port = 1111data = ''s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建套接字print 'Socket created's.bind((Host,port)) #把套接字绑定到ip地址s.listen(5)print 'Socket now listening'while True: conn,addr = s.accept()#接受连接 print 'Connected with'+'' +addr[0]+':'+str(addr[1]) #字符串拼接 nick = conn.recv(1024)#获取用户名 NotifyAll('Welcome'+' '+nick+' to the room!') print data print str((threading.activeCount()+1)/2)+'person(s)' conn.sendall(data) threading.Thread(target=clientThreadIn,args=(conn,nick)).start() threading.Thread(target=clientThreadOut,args=(conn,nick)).start()
编写客户端程序:
# -*-coding:utf-8-*-#socket 服务端和客户端 服务端监听 客户端的请求 链接确认import socketimport threadingoutString = ''inString = ''nick = ''#发送信息的函数def DealOut(sock): global nick,outString #声明为全局变量,进行赋值,这样才可以生效 while True: outString = raw_input() #输入 outString = nick+':'+outString#拼接cd sock.send(outString)#发送#接收信息def DealIn(sock): global inString while True: try: inString = sock.recv(1024) if not inString: break if outString != inString: print inString except: breaknick = raw_input('input your nickname:')#名字ip = raw_input('input your server ip address:')#ip地址sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建套接字,默认为ipv4sock.connect((ip,1111)) #发起请求,接收的是一个元组sock.send(nick)#多线程 接收信息 发送信息thin = threading.Thread(target=DealIn,args=(sock,))#调用threading 创建一个接收信息的线程'thin.start()thout = threading.Thread(target=DealOut,args=(sock,))# 创建一个发送信息的线程,声明是一个元组thout.start()
最后贴一张效果图

标签: #python局域网聊天室