server端
importview codesocket
server=socket.socket()
server.bind((
'127.0.0.1
',8080)) #
把位址繫結到套接字
server.listen() #
監聽鏈結
conn,addr = server.accept() #
接受客戶端鏈結
ret = conn.recv(1024) #
接收客戶端資訊
print(ret) #
列印客戶端資訊
conn.send(b'
hi') #
向客戶端傳送資訊
conn.close() #
關閉客戶端套接字
sk.close() #
關閉伺服器套接字(可選)
client端
importview codesocket
client = socket.socket() #
建立客戶套接字
client.connect(('
127.0.0.1
',8898)) #
嘗試連線伺服器
client.send(b'
hello!')
ret = client.recv(1024) #
對話(傳送/接收)
(ret)
client.close()
#關閉客戶套接字
127.0.0.1 本機回還位址
只能自己訪問自己 別人無法訪問
伺服器與客戶端的send與recv要一一對應
udp粘包問題出現的原因 :
使用了優化方法(nagle演算法),將多次間隔較小且資料量小的資料,合併成乙個大的資料塊,然後進行封包。
解決粘包問題的的方法:
服務端
importview codesocket
import
subprocess
import
struct
import
json
server =socket.socket()
server.bind((
'127.0.0.1
',8080))
server.listen(5)
while
true:
conn, addr =server.accept()
while
true:
try:
cmd = conn.recv(1024)
if len(cmd) == 0:break
cmd = cmd.decode('
utf-8')
obj = subprocess.popen(cmd,shell=true,stdout=subprocess.pipe,stderr=subprocess.pipe)
res = obj.stdout.read() +obj.stderr.read()
d =
json_d =json.dumps(d)
#1.先製作乙個字典的報頭
header = struct.pack('i'
,len(json_d))
#2.傳送字典報頭
conn.send(header)
#3.傳送字典
conn.send(json_d.encode('
utf-8'))
#4.再發真實資料
conn.send(res)
#conn.send(obj.stdout.read())
#conn.send(obj.stderr.read())
except
connectionreseterror:
break
conn.close()
客戶端
importview codesocket
import
struct
import
json
client =socket.socket()
client.connect((
'127.0.0.1
',8080))
while
true:
msg = input('
>>>:
').encode('
utf-8')
if len(msg) == 0:continue
client.send(msg)
#1.先接受字典報頭
header_dict = client.recv(4)
#2.解析報頭 獲取字典的長度
dict_size = struct.unpack('
i',header_dict)[0] #
解包的時候一定要加上索引0
#3.接收字典資料
dict_bytes =client.recv(dict_size)
dict_json = json.loads(dict_bytes.decode('
utf-8'))
#4.從字典中獲取資訊
(dict_json)
recv_size =0
real_data = b''
while recv_size < dict_json.get('
file_size
'): #
real_size = 102400
data = client.recv(1024)
real_data +=data
recv_size +=len(data)
print(real_data.decode('
gbk'))
網路程式設計(二)
網路程式設計基礎 二 struct in addr 這個結構體中儲存的是網路二進位制的ip位址 include struct hostent gethostbyname const char name name 網域名稱 返回值 struct hostent define h addr h addr...
網路程式設計(二)
一 流式服務和資料報服務 1 位元組流服務 傳送端send 只是將資料寫到tcp傳送緩衝區中,然後將傳送緩衝區中的資料打包成報文段傳送出去。接收端又將接收到的報文段寫到緩衝區中,最後recv 直接取資料。位元組流服務特點 資料沒有明確分割 由底層做分割 不分一定的報文段,什麼時候想發便可將寫入緩衝區...
網路程式設計(二)
在之前的部落格中,介紹了傳輸層的一種重要協議 tcp協議。今天來介紹另外一種傳輸層協議 udp 一 udp udp 無連線的 不可靠的 資料報服務。首先看一下udp報頭 從上圖可以看出,udp協議報頭比tcp協議報頭簡單很多,沒有tcp報頭裡面那麼多的保證機制,所以udp較比tcp簡單。不可靠 ud...