『壹』 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()
#未對以上代碼的正確性進行驗證。