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代码:


  
  1. import socket
  2. import sys
  3. import threading
  4. import time
  5. class client():
  6. def __init__(self):
  7. self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  8. self.ip = "127.0.0.1"
  9. def connect(self):
  10. try:
  11. self.s.connect((self.ip,8888))
  12. print("connect success")
  13. print('connect time: '+time.ctime())
  14. except ConnectionError:
  15. print('connect error')
  16. sys.exit(-1)
  17. except:
  18. print('unexpect error')
  19. sys.exit(-1)
  20. def send_sth(self):
  21. while True:
  22. sth=input('say something:\n')
  23. try:
  24. self.s.sendall(sth.encode('utf-8'))
  25. except ConnectionError:
  26. print('connect error')
  27. sys.exit(-1)
  28. except:
  29. print('unexpect error')
  30. sys.exit(-1)
  31. def receive(self):
  32. while True:
  33. try:
  34. r=self.s.recv(1024)
  35. print ('get message:'+r.decode('utf-8'))
  36. except ConnectionError:
  37. print('connect error')
  38. sys.exit(-1)
  39. except:
  40. print('unexpect error')
  41. sys.exit(-1)
  42. c1 = client()
  43. c1.connect()
  44. threading._start_new_thread(c1.receive,())
  45. c1.send_sth()

server代码:


  
  1. import socket
  2. import sys
  3. import threading
  4. import time
  5. def server():
  6. def bind():
  7. HOST='127.0.0.1'
  8. s.bind((HOST,8888))
  9. print("bind ok")
  10. def listen():
  11. s.listen(10)
  12. print ('Socket now listening')
  13. def send_sth(conn):
  14. while True:
  15. try:
  16. sth=input('say something:\n')
  17. conn.sendall(sth.encode('utf-8'))
  18. except ConnectionError:
  19. print('connect error')
  20. sys.exit(-1)
  21. except:
  22. print('unexpect error')
  23. sys.exit(-1)
  24. def recv(conn):
  25. while True:
  26. try:
  27. data=conn.recv(1024)
  28. data2=data.decode('utf-8')
  29. print('get message:'+data2)
  30. except ConnectionError:
  31. print('connect error')
  32. sys.exit(-1)
  33. except:
  34. print('unexpect error')
  35. sys.exit(-1)
  36. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  37. bind()
  38. listen()
  39. conn,addr=s.accept()
  40. print("connect success")
  41. print('connect time: '+time.ctime())
  42. threading._start_new_thread(recv,(conn,))
  43. send_sth(conn)
  44. if __name__=='__main__':
  45. server()

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

代码:


  
  1. import socket
  2. import threading
  3. class client(threading.Thread):
  4. def __init__(self,sth):
  5. threading.Thread.__init__(self)
  6. self.sth=sth
  7. def run(self):
  8. s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  9. ip="127.0.0.1"
  10. try:
  11. s.connect((ip,8888))
  12. except :
  13. print('con error')
  14. exit()
  15. #print("connect success")
  16. s.sendall(self.sth.encode('utf-8'))
  17. #print("send success")
  18. try:
  19. r=s.recv(1024)
  20. except:
  21. print('recv error')
  22. exit()
  23. print (r.decode('utf-8'))
  24. c1=client('hello 1')
  25. c1.start()
  26. c2=client('hello 2')
  27. 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个月内不可修改。