網路程式設計二

2022-05-05 03:27:09 字數 3036 閱讀 1262

server端

import

socket

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() #

關閉伺服器套接字(可選)

view code

client端

import

socket

client = socket.socket() #

建立客戶套接字

client.connect(('

127.0.0.1

',8898)) #

嘗試連線伺服器

client.send(b'

hello!')

ret = client.recv(1024) #

對話(傳送/接收)

print

(ret)

client.close()

#關閉客戶套接字

view code

127.0.0.1  本機回還位址

只能自己訪問自己  別人無法訪問

伺服器與客戶端的send與recv要一一對應

udp粘包問題出現的原因 :

使用了優化方法(nagle演算法),將多次間隔較小且資料量小的資料,合併成乙個大的資料塊,然後進行封包。

解決粘包問題的的方法:

服務端

import

socket

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()

view code

客戶端

import

socket

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.從字典中獲取資訊

print

(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'))

view code

網路程式設計(二)

網路程式設計基礎 二 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...