pythonsocket編程
① python socket編程中有沒有 AF
Socket 是進程間通信的一種方式,它與其他進程間通信的一個主要不同是:它能實現不同主機間內的進程間通信容,我們網路上各種各樣的服務大多都是基於 Socket 來完成通信的,例如我們每天瀏覽網頁、QQ 聊天、收發 email 等等。
要解決網路上兩台主機之間的進程通信問題,首先要唯一標識該進程,在 TCP/IP 網路協議中,就是通過 (IP地址,協議,埠號) 三元組來標識進程的,解決了進程標識問題,就有了通信的基礎了。
② 用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 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 udp編程的小問題
從錯誤代碼an
integer
is
required來看,需要提供一個整形。
要做的是改成
port0
=
21567,而不是
port0
=
』21567『。
希望能幫到你,有疑問請追問!
⑤ 求完整的用python語言實現socket編程,完成數據的發送,接收轉發的程序!!急!!!謝謝!!
看文檔中的樣例吧(底下前兩個),稍微改一下就是你所想回要的答了。
http://docs.python.org/2/library/socket.html
⑥ python的socket編程問題
struct在unpack的時候用大端方式讀取,先讀一個B,也就是一個位元組作為回類型,然後讀一個H,也就是大答端的兩位元組作為版本,然後是大段的兩位元組作為ln什麼的。
很多腳本語言都支持pack,unpack來序列化數據的,你要查一下具體的字元的含義。
⑦ 請問,我要用python語言實現socket編程,請問需要下載什麼軟體呢 急需啊~!!!!先謝謝了!
我從網上給你拷兩個例子
伺服器
#!/usr/bin/python
"USAGE:echoserver.py<port>"
,TCPServer
importsys,socket
classEchoHandler(BaseRequestHandler):
defhandle(self):
print"Clientconnected:",self.client_address
self.request.sendall(self.request.recv(2**16))
self.request.close()
iflen(sys.argv)!=2:
print__doc__
else:
TCPServer(('',int(sys.argv[1])),EchoHandler).serve_forever()
客戶端
#!/usr/bin/python
"USAGE:echoclient.py<server><word><port>"
fromsocketimport*
importsys
iflen(sys.argv)!=4:
print__doc__
sys.exit(0)
sock=socket(AF_INET,SOCK_STREAM)
sock.connect((sys.argv[1],int(sys.argv[3])))
message=sys.argv[2]
messlen,received=sock.send(message),0
ifmesslen!=len(message):
print"Failedtosendcompletemessage"
print"Received:",
whilereceived<messlen:
data=sock.recv(32)
sys.stdout.write(data)
received+=len(data)
sock.close()
⑧ python中使用socket編程,如何能夠通過UDP傳遞一個列表類型的數據
Python中的 list 或者 dict 都可以轉成JSON字元串來發送,接收後再轉回來。
首先
importjson
然後,把 list 或 dict 轉成 JSON
json_string=json.mps(list_or_dict)
用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
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)
s.sendto(json_string,address)
s.shutdown(socket.SHUT_RDWR)
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)
printmylist
s.shutdown(socket.SHUT_RDWR)
s.close()
請先運行server.py,再運行client.py
⑨ Python中用socket編寫伺服器和客戶端。。。
伺服器端代碼
while
1:
buf
=
s.recv(1024)
改成
while
1:
buf
=
conn.recv(1024)
看看能不能接收到信息
--------------
貌似你的服務端代碼
倆個while
1
有點問題