編寫基於tcp協議的套接字程式

2022-06-13 08:42:13 字數 3919 閱讀 5198

一:網路知識複習

1.cs架構和bs架構:

1.1什麼cs架構和bs架構是?

cs即client/server(客戶機/伺服器)結構,c/s結構在技術上很成熟,它的主要特點是互動性強、具有安全的訪問模式、網路通訊量低、響應速度快、利於處理大量資料。但是該結構的程式是針對性開發,變更不夠靈活,維護和管理的難度較大。通常只侷限於小型區域網,不利於擴充套件。並且,由於該結構的每台客戶機都需要安裝相應的客戶端程式,分布功能弱且相容性差,不能實現快速部署安裝和配置,因此缺少通用性,具有較大的侷限性。要求具有一定專業水準的技術人員去完成。

bs即browser/server(瀏覽器/伺服器)結構,就是只安裝維護乙個伺服器(server),而客戶端採用瀏覽器(browse)執行軟體。b/s結構應用程式相對於傳統的c/s結構應用程式是乙個非常大的進步。 b/s結構的主要特點是分布性強、維護方便、開發簡單且共享性強、總體擁有成本低。但資料安全性問題、對伺服器要求過高、資料傳輸速度慢、軟體的個性化特點明顯降低,這些缺點是有目共睹的,難以實現傳統模式下的特殊功能要求。例如通過瀏覽器進行大量的資料輸入或進行報表的應答、專用性列印輸出都比較困難和不便。此外,實現複雜的應用構造有較大的困難。

1.2他們的比較

2.公網和私網:

公網、私網是兩種internet的接入方式。

公網接入方式:上網的計算機得到的ip位址是internet上的非保留位址,公網的計算機和internet上的其他計算機可隨意互相訪問。

內網:也就是常說的區域網。是指在某一區域內由多台計算機互聯成的計算機組。一般是方圓幾千公尺以內。區域網可以實現檔案管理、應用軟體共享、印表機共享、工作組內的日程安排、電子郵件和傳真通訊服務等功能。區域網是封閉型的,可以由辦公室內的兩台計算機組成,也可以由乙個公司內的上千臺計算機組成。

3.arp協議

位址解析協議,即arp(address resolution protocol),是根據ip位址獲取實體地址的乙個tcp/ip協議。主機傳送資訊時將包含目標ip位址的arp請求廣播到網路上的所有主機,並接收返回訊息,以此確定目標的實體地址;arp命令可用於查詢本機arp快取中ip位址和mac位址的對應關係、新增或刪除靜態對應關係等

arp協議可以解析成它對應的那個mac位址

arp協議計算 ip和子網是否在區域網,在的話ip要mac位址  目標主機mac  目標主機ip

arp協議計算 ip不在乙個子網,閘道器mac(資料往外發),目標主機mac

往外傳送時候,原ip向閘道器傳送,閘道器向原ip要mac,後再向外部傳送

127.0.0.1,通常被稱為本地回環位址(loopback address),不屬於任何乙個有類別位址類。它代表裝置的本地虛擬介面,所以預設被看作是永遠不會宕掉的介面。在windows作業系統中也有相似的定義,所以通常在安裝網絡卡前就可以ping通這個本地回環位址。一般都會用來檢查本地網路協議、基本資料介面等是否正常的。

子網劃分

5.字串前面+b是專程bash型別等同於(『hello』.emcod('utf-8)

二:編寫基於tcp協議的套接字程式

socket是對應用層以下的層進行封裝

1.套接字工作流程

2.tcp如何使用

服務端:

import

socket

import

subprocess

#1買手機

phone=socket.socket(socket.af_inet,socket.sock_stream) #

流式協議

#phone.setsockopt(socket.sol_socket,socket.so_reuseaddr)

#2繫結銀行卡

phone.bind(('

127.0.0.1

',8082)) #

元組內放自己的ip位址

#再次啟動服務端,告訴埠已經占用,解決辦法有:1.換個埠,8080換掉同時客戶端也需要換掉 2.在繫結之前加上下面內容:phone.setsockopt(socket.sol_socket,socket.so_reuseaddr)

#防止位置在 #2繫結銀行卡 上面

#3開機

phone.listen(5) #

半連線池,5以內接受訪問請求。 5是訪問數量,也就是說除了正在訪問的這個,最多再有5個

#4建立鏈結的請求

while true: #

需要乙個迴圈不停地與客戶端互動

connect,client_addr=phone.accept()

print

(client_addr)

#5 收/發訊息

while

true:

try: #

避免客戶端突然中斷,不會造成服務端崩潰,針對windows

date=connect.recv(1024) #

最大的接受位元組數

if len(date)==0: #

針對linux系統的

break

cmd=date.decode('

utf-8')

obj=subprocess.popen(cmd,shell=true,

stdout=subprocess.pipe,

stderr=subprocess.pipe)

res1=obj.stdout.read()

res2=obj.stderr.read()

connect.send(res1+res2)

#print(date.decode('utf-8'))

#connect.send(date.upper())

except

exception:

break

#6掛**

connect.close()

#7關機

phone.close()

客戶端

import

socket

#1買手機

phone=socket.socket(socket.af_inet,socket.sock_stream) #

流式協議

#2打**

phone.connect(('

127.0.0.1

',8082))

#3發/收資料

while

true:

msg=input('

<<<<

').strip()

if len(msg)==0: #

避免客戶端輸入是空的時候出現異常,下面的無法操作

continue

phone.send(msg.encode(

'utf-8'))

date=phone.recv(1024)

print(date.decode('

utf-8'))

#4關閉

('127.0.0.1', 53338)      分別為客戶端ip和介面

基於tcp協議的套接字

簡單版本 一 服務端 import socket 1 買手機 拿到套接字物件,用來鏈結建立鏈結 phone socket.socket socket.af inet,socket.sock stream tcp稱為流式協議sock stream,udp稱為資料報協議sock dgram print ...

基於TCP協議的套接字程式設計

socket是應用層與tcp ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。socket模板已經為我們封裝好了,我...

基於TCP協議的套接字程式設計

基於socket通訊的內部演算法,當傳送的訊息為空的時候,接收端不會收到訊息,而傳送端向下執行到recv,兩端出於僵持狀態。所以在傳送端需要有個判斷,如果傳送的為空,則重新輸入傳送內容。socket是應用層與tcp ip協議通訊的中間軟體抽象層,它是一組介面。import socket 買手機 ph...