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程式。但總感覺和我想要的可以程式之間可以互動的東西不一樣。在網上找了各種方案,都因為各種原因給否定了...