網路程式設計之socket

2022-06-23 13:03:11 字數 4421 閱讀 6678

1,socket 通訊

#

#服務端:

import

socket

server =socket.socket()

server.bind((

'127.0.0.1,8080))

server.listen(5)

conn, addr =server.accept()

data = conn.recv(1024)

print

(data)

conn.send(

"hello")

conn.close()

server.close()

importsocket

## 客戶端

client = socket.socket()

client.connect(('127.0.0.1',8080))

whiletrue:

2, 連線迴圈+ 通訊迴圈

import

socket

"""服務端

固定的ip和port

24小時不間斷提供服務

"""server = socket.socket() #

生成乙個物件

server.bind(('

127.0.0.1

',8080)) #

繫結ip和port

server.listen(5) #

半連線池

while

true:

conn, addr = server.accept() #

等到別人來 conn就類似於是雙向通道

print(addr) #

('127.0.0.1', 51323) 客戶端的位址

while

true:

try:

data = conn.recv(1024)

print(data) #

b'' 針對mac與linux 客戶端異常退出之後 服務端不會報錯 只會一直收b''

if len(data) == 0:break

conn.send(data.upper())

except

connectionreseterror as e:

print

(e)

break

conn.close()

### 客戶端

import

socket

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)

data = client.recv(1024)

print(data)

tcp 粘包問題

import

socket

server =socket.socket()

server.bind((

'127.0.0.1

', 8080))

server.listen(5)

conn, addr =server.accept()

data = conn.recv(5)

print

(data)

data = conn.recv(4)

print

(data)

data = conn.recv(4)

print

(data)

客戶端import

socket

client =socket.socket()

client.connnet((

'127.0.0.1

', 8080))

client.send(b

'hello')

client.send(b

'hello')

client.send(b

'hello

')

4,解決粘包問題

#

##服務端

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

### 客戶端

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'

))"""

1.如何將對方傳送的資料收乾淨

"""

網路程式設計之socket

套接字 socket 是乙個抽象層,應用程式可以通過它傳送或接收資料,可對其進行像對檔案一樣的開啟 讀寫和關閉等操作。套接字允許應用程式將i o插入到網路中,並與網路中的其他應用程式進行通訊。網路套接字是ip位址與埠的組合。套接字起源於 20 世紀 70 年代加利福尼亞大學伯克利分校版本的 unix...

網路程式設計之socket

1 是什麼?socket又稱套接字,是能夠實現程序間通訊的乙個 東西 2 為什麼?socket是對tcp ip協議的乙個封裝,相當於軟體設計模式中的外觀者模式 socket作為按鈕,按鈕內部連線著tcp ip的若干個對應的協議,也其實可以簡單理解為socket內部封裝著與tcp ip參考模型中各層進...

網路程式設計之Socket程式設計

對 tcp ip udp socket 程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission co...