- #coding:utf-8
- import socket
- import threading
- import datetime
- import config
- import talkWindow
- import constant
- class Mythread(threading.Thread):
- def __init__(self, func, args, name=''):
- #线程类,供收发消息用
- #func:线程要执行的函数功能
- #args:func函数传递的参数
- #name:线程名字
- #isdaemon:是否设置成守护线程,默认为非
- def __init__(self, func, args, name='', isdaemon=False):
- threading.Thread.__init__(self)
- self.func = func
- self.args = args
- self.name = name
- self.daemon = isdaemon
- def run(self):
- #重写threading的run函数
- #用了apply函数
- apply(self.func, self.args, self.name, self.daemon)
- def sendmessage(tcpobject, windobject):
- #发送消息函数
- if windobject.send_button_text: #获得输入的消息内容
- try:
- tcpobject.send('%s' % (windobject.send_button_text)) #发送数据
- except Exception, err:
- print "%s, again sending" % (err)
- tcpobject.send('%s' % (windobject.send_button_text)) #发送数据
- windobject.send_button_text = None #将数据清空
- def recvmessage(tcpobject, windobject):
- #接收消息函数
- data = None
- try:
- data = tcpobject.recv(tcpobject.buffsize)
- except Exception, err:
- print "%s, again reveing" % (err)
- data = tcpobject.recv(tcpobject.buffsize)
- #将收到的数据显示在显示聊天框中
- if data:
- windobject.talk_window.insert(1.0, "%s\\n" % (data))
- def create_child_window():
- #创建两人聊天窗口
- child_talk = ClientSocket(child=True)
- class ClientSocket():
- def __init__(self, config=config.init_socket('./sockini.ini', 'socketini'), child=False):
- #客户端通讯类(创建聊天窗口;实现线程,收发信息用)
- #config:初始化sock连接的参数,init_socket第一参数是配置文件,第二参数是配置文件里面的标志参数
- #config 返回(HOST, PORT, BUFFERSIZE, ADDR) addr是(HOST,PORT) 元组
- #child是否是两人两人聊天窗口,是的话,点击上线列表将不在创建窗口
- self.host = config[0]
- self.port = config[1]
- self.buffsize = config[2]
- self.addr = config[3]
- self.ischild = child
- #套接字对象
- self.tcp_client = None
- #连接服务器
- try:
- print u"客户端开始连接服务器..."
- self.connet()
- except Exception, err:
- print "%s, again conneting\\n" % (err)
- self.connet()
- self.window = talkWindow.talkWindow() #创建窗口
- self.window.cur_select_ip = None #当前是否有点击想单聊
- #创建线程开始工作
- self.create_threading()
- while True:
- try :
- self.go_working()
- except Exception, err:
- print "%s, again working" % (err)
- self.go_working()
- #退出时关闭套接字
- self.tcp_client.close()
- def connet(self):
- #连接服务器
- self.tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建socket
- self.tcp_client.connect(self.addr) #连接服务器
- def create_threading(self):
- #创建收发线程
- self.recv = Mythread(recvmessage, (self.tcp_client, self.window), "recving")
- self.send = Mythread(sendmessage, (self.tcp_client, self.window), "sending")
- def go_working(self):
- #开始工作:传输和收发数据,主进程监听是否要单聊
- self.recv.start()
- self.send.start()
- #监听是否双击单人聊天
- if not self.ischild and self.window.cur_select_ip: #群聊单间ip才有丹聊
- create_child_window()
- if __name__ == "__main__":
- sock = ClientSocket()
- #该片段来自于http://www.codesnippet.cn/detail/250920136114.html
来源: http://www.codesnippet.cn/detail/250920136114.html