基於socket簡易版客戶端,服務端互動

2022-04-26 07:51:03 字數 3192 閱讀 7324

af_unix 是基於檔案型別的套接字家族

af_inet是 基礎網路型別的套接字家族

socket 模組屬性很多,可以直接使用from module import *語句 ,這樣socket所有的資料都被帶勁命名空間裡了. 減少**量(少用)

服務端

#1匯入

import socket

# 2.獲取套接字

s=socket.socket(socket.af_inet,socket.sock_stream)

#3繫結

s.bind(('127.0.0.1',8070))

#4開機,監聽

s.listen(1)

#5建立乙個通道和位址,等待接受**

conn,addr=s.accept()

#6接受這個值

data=conn.recv(1024)

#7釋放資料

print(data)

#8用通道傳送資料

conn.send('帥逼'.encode('gbk'))

#9關閉通道

conn.close()

#10關閉服務端

s.close()

客戶端

#匯入

import socket

#建立物件

s=socket.socket()

#連線服務端位址

s.connect(('127.0.0.1',8070))

s.send(b'adas')

#接受位元組資料

data=s.recv(1024)

#列印展現出來

print(data.decode('gbk'))

#關閉s.close()

把b格式轉成字串

ss=str(b'hello',encoding='utf8')

等於這個

ss=b'hello'.decode('utf8')

把字串轉成b格式

by=bytes('hello',encoding='utf8')

by='hello'.encode('utf8')

客戶端需要發資訊一直發資訊 所以有while迴圈 ,但是我們的服務端也需要一直接受資訊,否則發資訊就沒有意義了

這個時候就需要加上try 以及 except exception 如果出現了錯誤 ,那麼咱們需要怎麼做。。

總結:服務端server

#1匯入

import socket

# 2.建立物件

s=socket.socket(socket.af_inet,socket.sock_stream)

#3繫結

s.bind(('127.0.0.1',8070))

#開機,監聽

s.listen(1)

#建立乙個通道和位址,等待接受**

conn,addr=s.accept()

#接受這個值

while true:

try:

#等待接受 最大收1024位元組

data=conn.recv(1024)

#釋放資料

print(data.decode('utf8'))

except exception:

conn.close()

break

client 客戶端

匯入 建立 連線 傳送資訊 轉換格式

import socket

#建立新物件

s=socket.socket()

#連線直接用

s.connect('127.0.0.1',8070)

#傳送資訊

while true:

msg=input('輸入')

#傳送輸入資料

s.send(msg.encode('utf8'))

服務端要一直穩定的執行,不能客戶端斷了 咱們的服務端等著連線的**需要重寫一遍,所以應該讓服務端迴圈等著客戶端的連線(但是接受,列印客戶資料資訊,需要在連線之後寫)所以需要加上乙個迴圈巢狀,迴圈巢狀是 內層巢狀執行break掉才會繼續執行外層迴圈的資訊(稱之為結算執行)。

需求精簡:服務端要能夠一直的迴圈等待客戶端連線,蛋不需要發一次資訊就連線一次。

實現精簡:巢狀迴圈 等待客戶端連線**寫在大迴圈,接受客戶資料資訊,與列印資訊放在內層迴圈裡面。

……

#接受這個值

while true:

print('等待客戶端的連線')

conn,addr=s.accept()

while true:

try:

#等待接受 最大收1024位元組

data=conn.recv(1024)

#釋放資料

print(data.decode('utf8'))

except exception:

conn.close()

break

conn.close()

addr是客戶端的位址

tcp粘包就是指傳送方傳送的若干個包資料 --->接收方接受時粘成乙個包,兩個資料報是有資料頭尾的,後乙個包可能會緊接著前乙個包的尾

可能是傳送方造成的,也可能是有接收方造成的,傳送方因其粘包是有tcp協議本身造成的,如果連續幾次傳送資料很少,那麼tcp會根據優化演算法把這些資料合成乙個包後一次傳送出去,這樣接收方就收到了粘包資料。

長度不變,就不會粘包,因為粘包,傳送方或者接收方可能會少資料多資料,固定他的位元組的長度就不會產生粘包

為位元組流加上自定義固定長度報頭,報頭中包含位元組流長度,然後一次send到對端,對端在接收時,先從換從中取出定長的報頭,然後開啟包裹取真實資料,

主要是把乙個型別轉成固定長度的bytes。核心

步驟

# 導報#

import struct

#打包建立物件裡面有模式(以字串表示),跟這個資料物件

obj=struct.pack('i',1234532111)

print(obj)

print(len(obj)) #固定4個位元組的長度

#開啟包裹,反解出來

l=struct.unpack('i',obj)[0]#是乙個小元祖 取索引第0個

print(l)

socket 服務端 客戶端(注釋版)

usr bin env python coding utf 8 time 2017 8 22 16 14 author mr zhang site file server.py software pycharm from socket import import subprocess import ...

SOCKET客戶端程式設計

1.建立socket物件 socket建構函式有4個引數,第乙個是family,代表位址家族af net,af net6等,第二個是type,套接字型別sock stream 流套接字 和sock dgram 資料報套接字 import socket s socket.socket socket.a...

Socket 不同客戶端程式之間的簡易互動方式

前一段有這麼乙個開發需求,需要在電腦的web程式呼叫c 的win程式,然後兩個程式進行通訊。剛接到這個需求的時候完全是懵的,沒有一點頭緒。然後上網查了一些,說的都是修改登錄檔,然後web可以呼叫win程式。但總感覺和我想要的可以程式之間可以互動的東西不一樣。在網上找了各種方案,都因為各種原因給否定了...