zoukankan      html  css  js  c++  java
  • socket编程学习-------python打造多人聊天室

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

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

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

    1.编写服务器端程序:

     1 # -*-coding:utf-8-*-
     2 
     3 #服务端
     4 
     5 import socket
     6 import threading
     7 
     8 def clientThreadIn(conn,nick): 
     9     global data
    10     while True:
    11         try:
    12             temp = conn.recv(1024)#客户端发过来的消息
    13             if not temp:
    14                 conn.close()
    15                 return
    16             NotifyAll(temp)
    17             print data
    18 
    19         except:
    20             NotifyAll(nick+'leaves the room')#出现异常就退出
    21             print data
    22             return
    23 
    24 def clientThreadOut(conn,nick):
    25     global data
    26     while True:
    27         if con.acquire():
    28             con.wait()#堵塞,放弃对资源的占有  等待通知运行后面的代码
    29             if data:
    30                 try:
    31                     conn.send(data)
    32                     con.release()
    33                 except:
    34                     con.release
    35                     return
    36 
    37 
    38 def NotifyAll(ss):
    39     global  data
    40     if con.acquire():#获取锁
    41         data = ss
    42         con.notifyAll()#当前线程放弃对资源的占有,通知所有等待x线程
    43         con.release()
    44 
    45 
    46 con = threading.Condition()#条件
    47 Host = raw_input('input the server ip address:')# ip地址
    48 port = 1111
    49 data = ''
    50 
    51 
    52 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建套接字
    53 print 'Socket created'
    54 s.bind((Host,port)) #把套接字绑定到ip地址
    55 s.listen(5)
    56 print 'Socket now listening'
    57 
    58 while True:
    59     conn,addr = s.accept()#接受连接
    60     print 'Connected with'+'' +addr[0]+':'+str(addr[1]) #字符串拼接
    61     nick = conn.recv(1024)#获取用户名
    62     NotifyAll('Welcome'+' '+nick+' to the room!')
    63     print data
    64     print str((threading.activeCount()+1)/2)+'person(s)'
    65     conn.sendall(data)
    66     threading.Thread(target=clientThreadIn,args=(conn,nick)).start()
    67     threading.Thread(target=clientThreadOut,args=(conn,nick)).start()

    2.编写客户端程序:

     1 # -*-coding:utf-8-*-
     2 
     3 #socket 服务端和客户端    服务端监听   客户端的请求  链接确认
     4 
     5 import socket
     6 import threading
     7 
     8 outString = ''
     9 inString = ''
    10 nick = ''
    11 
    12 #发送信息的函数
    13 def DealOut(sock):
    14     global nick,outString #声明为全局变量,进行赋值,这样才可以生效
    15     while True:
    16         outString = raw_input() #输入
    17         outString = nick+':'+outString#拼接cd
    18         sock.send(outString)#发送
    19 
    20 #接收信息
    21 def DealIn(sock):
    22     global inString
    23     while True:
    24         try:
    25             inString = sock.recv(1024)
    26             if not inString:
    27                 break
    28             if outString != inString:
    29                 print inString
    30         except:
    31             break
    32 
    33 
    34 
    35 nick = raw_input('input your nickname:')#名字
    36 ip = raw_input('input your server ip address:')#ip地址
    37 
    38 
    39 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建套接字,默认为ipv4
    40 sock.connect((ip,1111)) #发起请求,接收的是一个元组
    41 sock.send(nick)
    42 
    43 #多线程  接收信息 发送信息
    44 thin = threading.Thread(target=DealIn,args=(sock,))#调用threading 创建一个接收信息的线程'
    45 thin.start()
    46 
    47 thout = threading.Thread(target=DealOut,args=(sock,))#    创建一个发送信息的线程,声明是一个元组
    48 thout.start()

    3.最后贴一张效果图

  • 相关阅读:
    Nginx Backup配置
    CANas分析软件,DBC文件解析,CAN报文分析,仿CANoe曲线显示
    MySQL 报错:MySQL Illegal mix of collations for operation 'like'
    docker部署rebbitmq
    docker部署kafka
    nodejs 环境配置
    spring是怎么运行的?
    Java发展的时间表
    单例模式(转)
    disable的错误使用
  • 原文地址:https://www.cnblogs.com/Beyond-Ricky/p/8079602.html
Copyright © 2011-2022 走看看