網路通訊三素質:
一、ip位址
二、埠號
三、傳輸協議 tcp安全但慢,udp快。
socket程式設計
(一收一發)
在python3裡,無論是收,還是發,必須是 bytes型別。
怎麼改?
bytes
(x,"utf8"
)# x 是要改的變數,注意後面要加編碼格式 utf8
server下的方法:
client下的方法:
建立乙個簡單的連線:
import socket
sk=socket.socket(
)# 建立socket這個物件,是tcp連線,如果想改udp的話,需要改裡邊的type引數
address=
("127.0.0.1"
,8000
)# 連線的位址必須用元組的形式,8000是埠號,1024以下系統占用的,所以用8000+的
sk.bind(address)
# 繫結這個ip位址
sk.listen(3)
# 指定客戶端排除等待的數
print
("waiting........"
)conn,addr=sk.accept(
)# 等待客戶端連線它。
inp=
input
(">>>>"
)conn.send(
bytes
(inp,
"utf8"))
# 向客戶端傳送 bytes 型別的內容。
import socket
sk=socket.socket(
)address=
("127.0.0.1"
,8000
)# 客氣端的ip
sk.connect(address)
data=sk.recv(
1024
)# 一次接收多少位元組的內容,一般用1024
print
(str
(data,
"utf8"))
# 因為 data 發過來時 bytes 型別,所以接收時要用 utf8 解碼成字串。
注意:在server端 conn 是通訊介面物件,而在client 端 sk 是介面物件 。所以,在 s 端 要用 conn.send 或 conn.recv 進行發,收。而在c端要用 sk.send 和 sk.recv 進行發收。
import socket
sk=socket.socket(
)address=
("127.0.0.1"
,8000
)sk.bind(address)
sk.listen(5)
print
("writing....."
)while
true
: conn,addr=sk.accept(
)# 等待對面連線 accept 接受的意思
while
true
: data=conn.recv(
1024
)# 接收到的空的話,繼續等待,認為沒有發過來內容。所以,一收一發不能發空。
ifnot data:
break
print
(str
(data,
"utf8"))
inp=
input
("你可以傳送資訊》"
) conn.send(
bytes
(inp,
"utf8"
))
c端:
import socket
sk=socket.socket(
)address=
("127.0.0.1"
,8000
)sk.connect(address)
# connect 連線的意思
while
true
: inp=
input
("你可以傳送資訊》"
)if inp==
"exit"
:break
sk.send(
bytes
(inp,
"utf8"))
data=sk.recv(
1024
)print
(str
(data,
"utf8"
))
補充的知識點:
import subprocess # 在cmd 中執行命令時呼叫的模組
a=subprocess.popen(
"dir"
,shell=
true
,stdout=subprocess.pipe)
# stdout=subprocess.pipe 的意思是從子程序中調入到主程序中,必須這樣寫。
print
(str
(a.stdout.read(),
"gbk"))
# 這裡不能用 utf8 要用 gbk
import socket
import subprocess
sk=socket.socket(
)address=
("127.0.0.1"
,8000
)sk.bind(address)
sk.listen(3)
print
("wirting........"
)while
true
: conn, addr = sk.accept(
)while
true
:try
: data = conn.recv(
1024
)except exception:
break
ifnot data:
break
print
(str
(data,
"utf8"))
a = subprocess.popen(
str(data,
"utf8"
), shell=
true
, stdout=subprocess.pipe)
conn_result=a.stdout.read(
)# 把 a.stdout.read() 的執行結果交給conn_result
# 在同時發兩個 send 時,如果第一 send 傳送的內容告別小,可以產生「粘包」現象,處理方法是在它們之間加乙個 recv 當然在,另外一端同乙個地方對應加乙個 send 接收一下。發的內容是什麼都行。
conn.send(conn_result)
# 執行結果傳送給 c 端。
c端:
import socket
sk=socket.socket(
)address=
("127.0.0.1"
,8000
)sk.connect(address)
while
true
: inp=
input
(">>>"
)if inp==
"exit"
:break
sk.send(
bytes
(inp,
"utf8"))
data=sk.recv(
1024
)print
(str
(data,
"gbk"
))
網路程式設計(一)
最近在學習網路程式設計,還是寫點筆記來督促下自己,邊寫邊學才不至於懶惰。我其實一直對網路通訊很是好奇,以前也經常想網路遊戲和聊天軟體是如何使使用者互連並進行通訊的呢?後來接觸到套接字,並且還能做些簡單的通訊,但對其中的工作原理渾然不知,凡事總是如此,你不想被某事束縛或牽著鼻子走,就總會想著去了解更深...
網路程式設計(一)
osi七層模型 開放系統互連參考模型 open system interconnect 是國際標準化組織iso和國際電報 諮詢委員會ccitt聯合制定的開放系統互連參考模型,為開放式互連系統提供了一種功能結構的框架。osi系統分為七層,物理層,資料鏈路層,網路層,傳輸層,會話層,表示層,應用層。tc...
網路程式設計(一)
網路檢視器 傳送http請求 url url new url address 獲取連線物件,並沒有建立連線 設定連線和讀取超時 conn.setconnecttimeout 5000 conn.setreadtimeout 5000 設定請求方法,注意必須大寫 conn.setrequestmeth...