pythonsocket編程
❶ 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關閉之後立即執行一段代碼
自己實現MySocket類,繼承自socket,然後重寫它的close方法,在裡面調用父類close方法,再加上你自己想做的工作,其他不要動。
❸ 以封裝成幀的形式傳送多個文件python網路編程
摘要 import socket #網路編程模塊
❹ python的socket編程問題
struct在unpack的時候用大端方式讀取,先讀一個B,也就是一個位元組作為類型,然後讀一個H,也就是大端的兩位元組作為版本,然後是大段的兩位元組作為ln什麼的。
很多腳本語言都支持pack,unpack來序列化數據的,你要查一下具體的字元的含義。
❺ python socket編程中listen和accept的區別
listen函數在一般在調用bind之後-調用accept之前調用,它的函數原型是:
intlisten(int sockfd, int backlog)
參數sockfd
被listen函數作用的套接字,sockfd之前由socket函數返回。在被socket函數返回的套接字fd之時,它是一個主動連接的套接字,也就是此時系統假設用戶會對這個套接字調用connect函數,期待它主動與其它進程連接,然後在伺服器編程中,用戶希望這個套接字可以接受外來的連接請求,也就是被動等待用戶來連接。由於系統默認時認為一個套接字是主動連接的,所以需要通過某種方式來告訴系統,用戶進程通過系統調用listen來完成這件事。
參數backlog
這個參數涉及到一些網路的細節。進程處理一個一個連接請求的時候,可能還存在其它的連接請求。因為TCP連接是一個過程,所以可能存在一種半連接的狀態,有時由於同時嘗試連接的用戶過多,使得伺服器進程無法快速地完成連接請求。如果這個情況出現了,伺服器進程希望內核如何處理呢?內核會在自己的進程空間里維護一個隊列以跟蹤這些完成的連接但伺服器進程還沒有接手處理或正在進行的連接,這樣的一個隊列內核不可能讓其任意大,所以必須有一個大小的上限。這個backlog告訴內核使用這個數值作為上限。
毫無疑問,伺服器進程不能隨便指定一個數值,內核有一個許可的范圍。這個范圍是實現相關的。很難有某種統一,一般這個值會小30以內。
accept函數
摘要:accept()用來接受參數s的socket連接,它的函數原型是:
intaccept(int s,struct sockaddr * addr,int * addrlen)
服務程序調用accept函數從處於監聽狀態的流套接字s的客戶連接請求隊列中取出排在最前的一個客戶請求,並且創建一個新的套接字來與客戶套接字創建連接通道,如果連接成功,就返回新創建的套接字的描述符,以後與客戶套接字交換數據的是新創建的套接字;如果失敗就返回 INVALID_SOCKET。該函數的第一個參數指定處於監聽狀態的流套接字;操作系統利用第二個參數來返回新創建的套接字的地址結構;操作系統利用第三個參數來返回新創建的套接字的地址結構的長度。
❻ 求完整的用python語言實現socket編程,完成數據的發送,接收轉發的程序!!急!!!謝謝!!
http://hi..com/bqlymjtdjsbcjtd/item/c7a718cdf44f715abcef6900 應該有點參考價值
❼ 用python進行socket編程老是報錯error: [Errno 10061] 怎麼回事啊好心人幫幫忙啊!!在線等!謝了
出現Errno10061 是因為目標主機主動拒絕,連接不能建立。
這通常是因為試圖連接到一個遠程主機上不活動的服務,如沒有伺服器應用程序處於執行狀態。
解決方法:
1)你先啟動server,看是否可以正常啟動。
2)因為是基於TCP的,所以你試試telnet可否鏈接到server上,格式為 telnet 127.0.0.1 5007 如果telnet沒有找到的話,就配置下啟動telnet。
3) 如果telnet沒有成功的話,則看下是否允許python訪問網路,在控制面板里配置下,如果不是要允許訪問。
4)最後,服務端自己的監聽地址和客戶端書寫的服務端地址形式必須要完全對應,或者服務端地址寫成空字元串」「形式,表示所有可用地址。程序才能正常傳輸文件。
意思就是:
1.服務端和客戶端要在一台主機上做測試的話,要不全寫成"localhost"或者全寫成"127.0.0.1"形式,要不全寫成自己的內網IP或外網IP,如"192.168.0.10"形式;
2.不在同一個主機上的話,服務端本地地址不能寫成"127.0.0.1"或者"localhost",而要寫成自己的內網IP或外網IP形式。
3.最簡單一種方法:服務端地址寫成""形式。
❽ Python網路編程
在當今Python伺服器框架 (framework, 比如Django, Twisted, web.py等等) 橫行的時代,從底層的socket開始寫伺服器似乎是一個出力不討好的笨方法。框架的意義在於掩蓋底層的細節,提供一套對於開發人員更加友好的API,並處理諸如MVC的布局問題。框架允許我們快速的構建一個成型而且成熟的Python伺服器。然而,框架本身也是依賴於底層(比如socket)。對於底層socket的了解,不僅可以幫助我們更好的使用框架,更可以讓我們明白框架是如何設計的。更進一步,如果擁有良好的底層socket編程知識和其他系統編程知識,你完全可以設計並開發一款自己的框架。如果你可以從底層socket開始,實現一個完整的Python伺服器,支持用戶層的協議,並處理好諸如MVC(Model-View-Control)、多線程(threading)等問題,並整理出一套清晰的函數或者類,作為介面(API)呈現給用戶,你就相當於設計了一個框架。socket介面是實際上是操作系統提供的系統調用。socket的使用並不局限於Python語言,你可以用C或者JAVA來寫出同樣的socket伺服器,而所有語言使用socket的方式都類似(Apache就是使用C實現的伺服器)。而你不能跨語言的使用框架。框架的好處在於幫你處理了一些細節,從而實現快速開發,但同時受到Python本身性能的限制。我們已經看到,許多成功的網站都是利用動態語言(比如Python, Ruby或者PHP,比如twitter和facebook)快速開發,在網站成功之後,將代碼轉換成諸如C和JAVA這樣一些效率比較高的語言,從而讓伺服器能更有效率的面對每天億萬次的請求。在這樣一些時間,底層的重要性,就遠遠超過了框架。
❾ Python的socket編程recv(1024)為什麼收不到數據
原來Python的socket.recv(n)函數,並沒有真正將我們希望接收的數據字長n全部接收,只需要保證Python將我們希望接收的所有長度接收即可。那麼根據需求,我們自己實現一個接收的函數即可:
#------------------------------------------------------# RecvN# recv N bytes to target
#------------------------------------------------------def RecvN(socket, n):
totalContent = b''
totalRecved = 0
while totalRecved < n:
onceContent = socket.recv(n - totalRecved)print("onceContent", onceContent)totalContent += onceContent
totalRecved = len(totalContent)
return totalContent
# data = sockfd.recv(30 * 1024 + 14)
data = RecvN(sockfd, 30 * 1024 + 14)
這樣的話,就可以把我們所有需要接收的字長接收了。