Qt如果多线程的话,似乎会出BUG

1.服务端(server.py)

 import sys, socket, threading
 import binascii
 from PyQt4 import QtCore, QtGui

 class ListenThread(threading.Thread):
     def __init__(self, txt, server):
         threading.Thread.__init__(self)
         self.txt = txt
         self.server = server
     def run(self):
         self.txt.append('来嘛来嘛\n')
         while 1:
             try:
                 client, addr = self.server.accept()
                 self.txt.append('连接来自:{}:{}\n'.format(addr[0], addr[1]))
                 data = client.recv(1024)
                 self.txt.append('收到数据:{}\n'.format(data.decode('utf-8')))
                 client.send('I Got:'.encode('utf-8') + data)
                 client.close()
                 self.txt.append('关闭客户端\n')
             except:
                 self.txt.append('关闭连接\n')
                 break
 class ControlThread(threading.Thread):
     def __init__(self, txt):
         threading.Thread.__init__(self)
         self.txt = txt
         self.event = threading.Event()
         self.event.clear()
     def run(self):
         self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         self.server.bind(('', 1051))
         self.server.listen(1)
         self.txt.append('正在等待连接\n')
         self.lsn = ListenThread(self.txt, self.server)
         self.lsn.setDaemon(True)
         self.lsn.start()
         self.event.wait()
         self.server.close()
     def stop(self):
         self.event.set()

 class MyWindow(QtGui.QWidget):
     def __init__(self):
         QtGui.QWidget.__init__(self)
         self.setWindowTitle('服务端')
         self.resize(485, 300)

         self.btn1 = QtGui.QPushButton('开始监听')
         self.btn2 = QtGui.QPushButton('停止监听')
         self.txt = QtGui.QTextEdit()

         self.grid = QtGui.QGridLayout()
         self.grid.addWidget(self.btn1, 0, 0)
         self.grid.addWidget(self.btn2, 0, 1)
         self.grid.addWidget(self.txt, 1, 0, 1, 2)
         self.setLayout(self.grid)

         self.connect(self.btn1, QtCore.SIGNAL('clicked()'), self.onBtn1)
         self.connect(self.btn2, QtCore.SIGNAL('clicked()'), self.onBtn2)
     def onBtn1(self):
         self.ctrl = ControlThread(self.txt)
         self.ctrl.setDaemon(True)
         self.ctrl.start()
     def onBtn2(self):
         self.ctrl.stop()

 app = QtGui.QApplication(sys.argv)
 mywindow = MyWindow()
 mywindow.show()
 app.exec_()

2.客户端(client.py)

 import sys, socket, threading
 import binascii
 from PyQt4 import QtCore, QtGui

 class ListenThread(threading.Thread):
     def __init__(self, txt, server):
         threading.Thread.__init__(self)
         self.txt = txt
         self.server = server
     def run(self):
         self.txt.append('来嘛来嘛\n')
         while 1:
             try:
                 client, addr = self.server.accept()
                 self.txt.append('连接来自:{}:{}\n'.format(addr[0], addr[1]))
                 data = client.recv(1024)
                 self.txt.append('收到数据:{}\n'.format(data.decode('utf-8')))
                 client.send('I Got:'.encode('utf-8') + data)
                 client.close()
                 self.txt.append('关闭客户端\n')
             except:
                 self.txt.append('关闭连接\n')
                 break
 class ControlThread(threading.Thread):
     def __init__(self, txt):
         threading.Thread.__init__(self)
         self.txt = txt
         self.event = threading.Event()
         self.event.clear()
     def run(self):
         self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         self.server.bind(('', 1051))
         self.server.listen(1)
         self.txt.append('正在等待连接\n')
         self.lsn = ListenThread(self.txt, self.server)
         self.lsn.setDaemon(True)
         self.lsn.start()
         self.event.wait()
         self.server.close()
     def stop(self):
         self.event.set()

 class MyWindow(QtGui.QWidget):
     def __init__(self):
         QtGui.QWidget.__init__(self)
         self.setWindowTitle('服务端')
         self.resize(485, 300)

         self.btn1 = QtGui.QPushButton('开始监听')
         self.btn2 = QtGui.QPushButton('停止监听')
         self.txt = QtGui.QTextEdit()

         self.grid = QtGui.QGridLayout()
         self.grid.addWidget(self.btn1, 0, 0)
         self.grid.addWidget(self.btn2, 0, 1)
         self.grid.addWidget(self.txt, 1, 0, 1, 2)
         self.setLayout(self.grid)

         self.connect(self.btn1, QtCore.SIGNAL('clicked()'), self.onBtn1)
         self.connect(self.btn2, QtCore.SIGNAL('clicked()'), self.onBtn2)
     def onBtn1(self):
         self.ctrl = ControlThread(self.txt)
         self.ctrl.setDaemon(True)
         self.ctrl.start()
     def onBtn2(self):
         self.ctrl.stop()

 app = QtGui.QApplication(sys.argv)
 mywindow = MyWindow()
 mywindow.show()
 app.exec_()

Python -- 网络编程 -- Socket简单网络通信的更多相关文章

  1. Python网络编程-Socket简单通信(及python实现远程文件发送)

    学习python中使用python进行网络编程,编写简单的客户端和服务器端进行通信,大部分内容来源于网络教程,这里进行总结供以后查阅. 先介绍下TCP的三次握手: 1,简单的发送消息: 服务器端: i ...

  2. Python网络编程socket

    网络编程之socket 看到本篇文章的题目是不是很疑惑,what is this?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是 ...

  3. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  4. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  5. python网络编程socket /socketserver

    提起网络编程,不同于web编程,它主要是C/S架构,也就是服务器.客户端结构的.对于初学者而言,最需要理解的不是网络的概念,而是python对于网络编程都提供了些什么模块和功能.不同于计算机发展的初级 ...

  6. python --- 网络编程Socket

    网络编程 定义:所为网络编程即是对信息的发送和接收. 主要工作: (1)发送端:将信息以规定的协议组装成数据包. (2)接收端:对收到的数据包解析,以提取所需要的信息. Socket:两个在网络上的程 ...

  7. python网络编程——socket基础篇

    python的网络编程比c语言简单许多, 封装许多底层的实现细节, 方便程序员使用的同时, 也使程序员比较难了解一些底层的东西. 1 TCP/IP 要想理解socket,首先得熟悉一下TCP/IP协议 ...

  8. Python 网络编程——socket

    一 客户端/服务器架构 客户端(Client)服务器(Server)架构,即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) 理想/目标状态—— 最常用的软件服务器是 ...

  9. Day10 Python网络编程 Socket编程

    一.客户端/服务器架构 1.C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务)[QQ,SSH,MySQL,FTP] 2.C/S架构与socket的关系: 我们学习soc ...

随机推荐

  1. 201709012工作日记--一台电脑创建两个Github账户上传代码

    1. 在一台主机上面使用多个GitHub账号 有时候,我们需要将个人账号和公司账号区分,这时候我们就会需要在一台电脑上使用2个不同的git账号. 2. 上传文件 http://blog.csdn.ne ...

  2. QGIS Server Quickstart

    http://live.osgeo.org/en/quickstart/qgis_mapserver_quickstart.html

  3. 阿里Sophix热修复

    阿里巴巴对Android热修复技术已经进行了长达多年的探索. 最开始,是手淘基于Xposed进行了改进,产生了针对Android Dalvik虚拟机运行时的Java Method Hook技术,Dex ...

  4. hdu 2189 悼念512汶川大地震遇难同胞——来生一起走

    题目 这道题用了,埃式筛选法和背包,我自己没有做出来,看了别人的代码,我也做不出来,特别是c[j]+=c[j-b[i]];弄了好久都没有弄懂. 这道题的解题思路:主要是先把150以内的所有素数找出来, ...

  5. 团队项目(第四周冲刺之二)—GG队

    项目冲刺: 队员 学号 叶尚文(队长) 3116008802 蔡晓晴 3216008808 杜婷萱 3216008809 龙剑初 3116004647 于泽浩 3116004661 (先把帅气的合照不 ...

  6. [Ubuntu Version] 如何在terminal 查看当前 ubuntu的版本号

    命令: locate locate /etc/*release/etc/lsb-release/etc/os-release 命令: catcat /etc/os-releaseNAME=" ...

  7. 常用kubectl命令总结

    command kubectl kubectl 输出格式 显示Pod的更多信息 kubectl get pod <pod-name> -o wide 以yaml格式显示Pod的详细信息 k ...

  8. VisualStudio神级插件——JetBrains Resharper 2018.2.3 Ultimate完美破解版+教程

    ReSharper是一个JetBrains公司出品的著名的代码生成工具,是Visual Studio里面的一个插件.它包括一系列丰富的能大大增加C#和Visual Basic .NET开发者生产力的特 ...

  9. Office - Outlook

    将邮件存到本地 服务器容量有限,避免丢失和经常提示容量不足 步骤 在File->Account Settings->Account Settings下面 在Data Files标签页新建一 ...

  10. .net core初试 --- 控制台程序

    .net core这个名字对.net程序员来说都不陌生了,但貌似圈子里真正有开发经验的并不多,关键是公司的项目没需求. 今天我就趁着不忙上手玩了玩,搞明白了一些东西,心中也有了十万个为什么.那么现在与 ...