python实现点对点聊天程序

yipeiwu_com6年前Python基础

用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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

Python实现列表转换成字典数据结构的方法

本文实例讲述了Python实现列表转换成字典数据结构的方法。分享给大家供大家参考,具体如下: ''' [ {'symbol': 101, 'sort': 1, 'name': '...

Python列表解析配合if else的方法

用习惯列表解析之后会觉得超级酷,所以在尝试使用列表解析,把循环什么的写在一行里面。使用if的时候什么时候必须要有else,什么时候可以没有else一直没搞明白,直到今天!待我缓缓道来:...

Python中.py文件打包成exe可执行文件详解

Python中.py文件打包成exe可执行文件详解

前言 最近做了几个简单的爬虫python程序,于是就想做个窗口看看效果。 首先是,窗口的话,以前没怎么接触过,就先考虑用Qt制作简单的ui。这里用前面sinanews的爬虫脚本为例,制作...

使用Python画股票的K线图的方法步骤

使用Python画股票的K线图的方法步骤

导言 本文简单介绍了如何从网易财经获取某支股票的价格数据,并根据价格数据画出相应的日K线图。有助于新手了解并使用Python的相关功能。包括列表、自定义函数、for循环、if函数以及如何...

Python使用django框架实现多人在线匿名聊天的小程序

Python使用django框架实现多人在线匿名聊天的小程序

最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于python的django框架自己写了一个,支持手动实时更名,最下方提供了完整的源码. 在线聊天地址(无...