python聊天程序(socket+多线程)

举报
用户已注销 发表于 2021/11/19 05:57:49 2021/11/19
【摘要】 用Python实现点对点的聊天,2个程序,一个是client.py,一个是server.py,通过本机地址127.0.0.1连接进行通信,利用多线程把发送消息和接收消息分开独立进行。 client代码: import socketimport sysimport threadingimport timeclass cl...

用Python实现点对点的聊天,2个程序,一个是client.py,一个是server.py,通过本机地址127.0.0.1连接进行通信,利用多线程把发送消息和接收消息分开独立进行。


client代码:


      import socket
      import sys
      import threading
      import time
      class client():
       def __init__(self):
       self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
              self.ip = "127.0.0.1"
          def connect(self):
             try:
                  self.s.connect((self.ip,8888))
                 print("connect success")
                 print('connect time: '+time.ctime())
              except ConnectionError:
                 print('connect error')
                  sys.exit(-1)
              except:
                 print('unexpect error')
                  sys.exit(-1)
          def send_sth(self):
             while True:
                  sth=input('say something:\n')
                 try:
                      self.s.sendall(sth.encode('utf-8'))
                  except ConnectionError:
                     print('connect error')
                      sys.exit(-1)
                  except:
                     print('unexpect error')
                      sys.exit(-1)
          def receive(self):
             while True:
                 try:
                      r=self.s.recv(1024)
                     print ('get message:'+r.decode('utf-8'))
                  except ConnectionError:
                     print('connect error')
                      sys.exit(-1)
                  except:
                     print('unexpect error')
                      sys.exit(-1)
      c1 = client()
      c1.connect()
      threading._start_new_thread(c1.receive,())
      c1.send_sth()
  
 

server代码:


      import socket
      import sys
      import threading
      import time
      def server():
       def bind():
       HOST='127.0.0.1'
              s.bind((HOST,8888))
             print("bind ok")
         def listen():
       s.listen(10)
       print ('Socket now listening')
       def send_sth(conn):
       while True:
       try:
       sth=input('say something:\n')
                      conn.sendall(sth.encode('utf-8'))
                  except ConnectionError:
                     print('connect error')
                      sys.exit(-1)
                  except:
                     print('unexpect error')
                      sys.exit(-1)
         def recv(conn):
       while True:
       try:
       data=conn.recv(1024)
                      data2=data.decode('utf-8')
                     print('get message:'+data2)
                  except ConnectionError:
                     print('connect error')
                      sys.exit(-1)
                  except:
                     print('unexpect error')
                      sys.exit(-1)
          s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
         bind()
         listen()
          conn,addr=s.accept()
         print("connect success")
         print('connect time: '+time.ctime())
          threading._start_new_thread(recv,(conn,))
         send_sth(conn)
      if __name__=='__main__':
         server()
  
 

开启多线程有2种方法,上面2个程序都是用函数的方法,还有一种方法是用类继承threading类

代码:


      import socket
      import threading
      class client(threading.Thread):
       def __init__(self,sth):
       threading.Thread.__init__(self)
       self.sth=sth
       def run(self):
       s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
              ip="127.0.0.1"
             try:
                  s.connect((ip,8888))
              except :
                 print('con error')
                 exit()
             #print("connect success")
              s.sendall(self.sth.encode('utf-8'))
             #print("send success")
             try:
                  r=s.recv(1024)
              except:
                 print('recv error')
                 exit()
             print (r.decode('utf-8'))
      c1=client('hello 1')
      c1.start()
      c2=client('hello 2')
      c2.start()
  
 


文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/75119572

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。