‘壹’ python socket 如何实现广播单播切换
#三个线程:#线程1:产生递增的数字,转成字符串放到队列中#线程2:监听端口,将产生的连接放到列表中#线程3:从队列中取出数字,遍历连接列表,发送到所有客户端#线程1:产生递增的数字,转成字符串放到队列中classProcer(threading.Thread):
def__init__(self,work_queue):
super().__init__()#必须调用
self.work_queue=work_queue
defrun(self):
#print("Beginproce...")
num=1
whileTrue:
self.work_queue.put(str(num))
num=num+1
time.sleep(1)#暂停1秒#线程2:监听端口,将产生的连接放到列表中classSocketServer(threading.Thread):
def__init__(self,socket_list):
super().__init__()
self.socket_list=socket_list
defrun(self):
sock=socket.socket()
sock.bind(('',9090))
sock.listen(5)
print("Startlisten...")
whileTrue:
conn,addr=sock.accept()
print("Connectby",addr)
self.socket_list.append((conn,addr))#线程3:从队列中取出数字,遍历连接列表,发送到所有客户端classPrinter(threading.Thread):
def__init__(self,work_queue,socket_list):
super().__init__()#必须调用
self.work_queue=work_queue
self.socket_list=socket_list
defrun(self):
whileTrue:
num=self.work_queue.get()#当队列为空时,会阻塞,直到有数据
forsock,addrinself.socket_list:#遍历保存连接的列表
print("Send",num,"To",addr)
try:
sock.sendall(bytes(num+' ','utf-8'))#把字符串转换成字节数组发送
except:
print("Disconnectby",addr)#如果连接断开,发送会失败
self.socket_list.remove((sock,addr))#从列表中删除断开的连接defmain():
work_queue=queue.Queue()
socket_list=[]#为了更安全可靠,从多线程访问列表时应该加锁,
#这里做了简化,因为列表的增加删除操作基本上可以认为是线程安全的
socket_server=SocketServer(socket_list)
socket_server.daemon=True
socket_server.start()
printer=Printer(work_queue,socket_list)
printer.daemon=True#当主线程退出时子线程也退出
printer.start()
procer=Procer(work_queue)
procer.daemon=True#当主线程退出时子线程也退出
procer.start()
time.sleep(1)#这里要暂停一下,否则执行下一条语句时,会因队列为空而直接返回
work_queue.join()#主线程会停在这里,直到所有数字被get(),并且task_done(),因为没有调用task_done(),所在这里会一直阻塞,直到用户按^Cif__name__=='__main__':
main()
‘贰’ python socket通信问题
乱码只是这样说,别人不知道怎么回事啊。
可以用个线程上报啊。
‘叁’ python中使用socket编程,如何能够通过UDP传递一个列表类型的数据
Python中的 list 或者 dict 都可以转成JSON字符串来发送,接收后再转回来。
首先
importjson
然后,把 list 或 dict 转成 JSON
json_string=json.mps(list_or_dict)
如果你用的是Python3,这里的 json_string 会是 str 类型(即Python2的unicode类型),可能需要编码一下:
if type(json_string) == six.text_type:
json_string = json_string.encode('UTF-8')
用socket发送过去,例如
s.sendto(json_string,address)
对方用socket接收,例如
json_string,addr=s.recvfrom(2048)
把JSON转成 list 或 dict
list_or_dict=json.loads(json_string)
下面是个完整的例子:
client.py
#!/usr/bin/envpython
#-*-coding:UTF-8-*-
importsocket
importjson
importsix
address=('127.0.0.1',31500)
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
mylist=[1,2,3,4,5,6,7,8,9,10]
json_string=json.mps(mylist)
iftype(json_string)==six.text_type:
json_string=json_string.encode('UTF-8')
s.sendto(json_string,address)
s.close()
server.py
#!/usr/bin/envpython
#-*-coding:UTF-8-*-
importsocket
importjson
address=('127.0.0.1',31500)
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(address)
json_string,addr=s.recvfrom(2048)
mylist=json.loads(json_string)
print(mylist)
s.close()
请先运行server.py,再运行client.py
‘肆’ python socket 发送udp和tcp的区别
Python中的 list 或者 dict 都可以转成JSON字符串来发送,接收后再转回来。 首先 import json然后,把 list 或 dict 转成 JSON json_string = json.mps(list_or_dict)用socket发送过去,例如 s.sendto(json_string, address) 对方用socket接收...
‘伍’ 求完整的用python语言实现socket编程,完成数据的发送,接收转发的程序!!急!!!谢谢!!
看文档中的样例吧(底下前两个),稍微改一下就是你所想要的了。
http://docs.python.org/2/library/socket.html
‘陆’ python的socket怎么使用
http://www.pythontab.com/html/2013/pythonhexinbiancheng_0427/377.html
‘柒’ python中如何去学习那些socket
这个星期刚刚用Python写了几个 ping,dns(UDP 53)扫描以及tcp端口扫描的程序,总结有以下几点:
1. 多线程,一个线程负责发,一个线程负责收
2. 使用raw socket,需要有root权限,其中ICMP的raw socket需要设置参数告诉kernel IP头有你的程序添加。我在check sum这里卡了点时间,手里最好有本网络参考书,《TCP/IP illustrated》最好,在写代码之前必须对报文格式以及各字段做到心中有数。
3. 看看Python的struct/array文档看看怎么组包,解包
4. 除非你异常牛逼,否则还是需要debug工具,比如wireshark/tcpmp等工具配合让你看看自己发出来的包那里出了问题。如果用GUI的wireshark记得将option中的tcp/ip部分checksum option打开
把代码贴给你就让你失去自己动手的乐趣了!呵呵have fun!
‘捌’ python socket向客户端广播问题
import socket,traceback
host = '2.2.3.5'
port = 85
txt = input("请输入广播内容:")
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
s.bind((host,port))
print "Listen on the port 85......"
while True:
try:
sock,addr = s.recvfrom(8192)
print "Receive data from:",addr
s.sendto(txt,addr)#这里就是填写发送内容的
except (KeyboardInterrupt,SystemExit):
raise
except:
traceback.print_exc()
#未对以上代码的正确性进行验证。