python多线程socket
❶ python socket如何实现一个服务器对多个客户端进行交互。
使用多线程,下面的代码,简单实现一个多线程的web服务器:
#coding=utf-8
importsocket
importthreading
fromtimeimportsleep
defresponse(sock,addr):
print"收到请求"
data=sock.recv(1024)
printdata
sock.send(html)
sock.close()
html='''HTTP/1.1200OK Content-Type:text/html Helloworld!'''
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('0.0.0.0',80))
s.listen(50)
print"正在等待连接……"
while1:
sleep(0.1)
sock,addr=s.accept()
t=threading.Thread(target=response,args=(sock,addr))
t.start()
❷ python udp多线程的问题
for out_port in self.output_port:
soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
soc.connect(("localhost",out_port))
_output.append(soc)
不要用output_port,用input_port。
你这里是往input_port发送数据,不需要关心自己的port,而是对端的port
❸ Python中scapy和socket性能优化的问题
我这实验的结果是一个gethostbyaddr 2秒左右(没用多线程)不知楼主的情况怎么样
另外,如果不是非python不可,可以考虑用nbtscan嘛,python的gethostbyaddr是用c写的lib也就是说再优化也优化不到哪去的了
❹ Python,socket如何实现通过Server将client1的数据传给client2。
普通情况下是不行的。但是通过线程或者进程间的数据共享,还是可以的。
提供一个思路,使用多线程socketserver,针对每一个用户创建一个服务线程,然后在线程之间通过消息队列,共享数据。
参考:刘江的Python教程中关于多线程和多进程的章节
❺ python 线程卡在socket接收的while循环里
第一个循环错了。把第二个循环放在第一个循环里面。accept完了就收发数据,循环收发。收发完了,关闭了,就回到accept的等待状态 。
按你现在的逻辑是,accept完成后就一直等待,直到第二次accept
慢慢试验。建议你accept完成后建立一个线程,单独进行收发。
❻ python多线程能提高效率吗
很多爬虫工作者都遇到过抓取速度非常慢,现在的大多数网站都具备了反爬虫技术,对IP的访问频率限制很严格。如果想提升爬虫的速度,大家可以尝试以下方法。
一、尽量减少访问次数。
单次爬虫任务的大多耗时在网络请求等待响应,所以能减少网络请求就尽量减少请求,这样既能减少目标网站的压力,也能减少代理服务器的压力,提高工作效率。
二、精简流程,减少重复。
大部分网站并不是严格意义上的树状结构,而是多重交叉的网状结构,所以从多个入口深入的网页会有很多重复,一般根据URL或者ID进行唯一性判别,爬过的就不需要再爬。一些数据如果可以在一个页面内获取到,也可以在多个页面下获取到,那就选择只在一个页面内获取。
三、多线程任务。
大量爬虫是一个IO阻塞的任务,所以采用多线程的并发方式可以有效地提高整体速度。多线程可以更好地提高资源利用率,程序设计也更加坚定,程序响应也更快。
四、分布式任务。
上面三点都做到极致了,但是单机单位时间内能爬取到的网页数量还不足以达到目标,在指定时间内还不能及时的完成任务,那么就只能多机器来同时进行爬虫任务了,这就是分布式爬虫。
做好以上几点,基本可以将爬虫的效率提升大半,另外爬虫代理ip也是不可缺少的尤其是对于量大的任务,IPIDEA提供全球ip的同时更注重保护数据的安全,也可以减少反爬虫策略的触发,一举多得。
❼ python怎样建立socket服务器
下面的例子是多线程实现的socket服务器:
import socketimport threadingclass ThreadedServer(object):
def __init__(self, host, port):
self.host = host
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((self.host, self.port))
def listen(self):
self.sock.listen(5)
while True:
client, address = self.sock.accept()
client.settimeout(60)
threading.Thread(target = self.listenToClient,args = (client,address)).start()
def listenToClient(self, client, address):
size = 1024
while True:
try:
data = client.recv(size)
if data:
# Set the response to echo back the recieved data
response = data
client.send(response)
else:
raise error('Client disconnected')
except:
client.close()
return Falseif __name__ == "__main__":
while True:
port_num = input("Port? ")
try:
port_num = int(port_num)
break
except ValueError:
pass
ThreadedServer('',port_num).listen()
❽ python socketserver和socket的区别
区别:
1.首先介绍下socket
socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也
称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一 般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原 意那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务
内部调用流程为:
启动服务端程序
执行 TCPServer.init方法,创建服务端Socket对象并绑定 IP 和 端口
执行 BaseServer.init方法,将自定义的继承自SocketServer.BaseRequestHandler 的类 - MyRequestHandle赋值给 self.RequestHandlerClass
执行 BaseServer.server_forever 方法,While 循环一直监听是否有客户端请求到达 ...
当客户端连接到达服务器
执行 ThreadingMixIn.process_request 方法,创建一个 “线程” 用来处理请求
执行 ThreadingMixIn.process_request_thread 方法
执行 BaseServer.finish_request 方法,执行 self.RequestHandlerClass() 即:执行 自定义 MyRequestHandler 的构造方法(自动调用基类BaseRequestHandler的构造方法,在该构造方法中又会调用 MyRequestHandler的handle方法)
ForkingTCPServer
ForkingTCPServer和ThreadingTCPServer的使用和执行流程基本一致,只不过在内部分别为请求者建立 “线程” 和 “进程”。