一,什麼是網路程式設計?
所謂的網路程式設計就是,讓在不同的電腦上的軟體能夠進行資料傳遞,即程序之間的通訊
二,tcp/ip協議簡介
為了把全世界的所有不同型別的計算機都連線起來,就必須規定一套全球通用的協議,為了實現網際網路這個目標,網際網路協議簇(internetprotocolsuite)就是通用協議標準。因為網際網路協議包含了上百種協議標準,但是最重要的兩個協議是tcp和ip協議,所以,大家把網際網路的協議簡稱tcp/ip協議。
tcp/ip根據網路功能將網路分為了四層:鏈路層,網路層,傳輸層,應用層。有什麼用途呢,是為了規範網路資料傳輸。
三,埠
假如左邊的陌陌要和右邊的陌陌通訊,是怎麼實現的呢,首先左邊的陌陌通過ip位址找到右邊對應的一台電腦,但是電腦上有很多程序,那怎麼確定就要發給陌陌這個程序呢,答案是通過埠號來找到陌陌這個程序的,因為每台電腦上的不同程序都會對應乙個不同的埠號。就好像我要去朋友家裡玩,首先我知道他的家在**。到了他家裡的時候,有很多房間,有他媽媽的,弟弟的,所以我們要找到他自己的房間。這是的房間對應埠號,家裡的位址對應電腦的ip位址。
問題又來了,既然埠號是為了區分不同的程序的,那為什麼不用pid呢?每台電腦的不同程序也對應不同的pid啊?這是因為pid是不固定的,埠號是固定的,在一台的電腦上對應某個程序的pid是3520,在別的電腦上相同的程序的pid可能就是3529了,所以才要用埠號來重新區分程序用於不同電腦上的通訊。
埠的分類:1.知名埠(0~1023) 2.動態埠(1024~65535)
知名埠如:80埠用於http服務,21埠用於ftp服務。
動態埠是使用者可以自己分配的。
如何檢視自己的埠:netstat -an
四,ip位址
用邏輯值來標記一台電腦,如用192.168.1.100來標記這一台電腦。這個邏輯值就是ip位址。
五,udp程式設計
udp通訊過程模型:
udp程式設計客戶端:
客戶端首先要宣告乙個udpsocket,宣告之後才能用send發訊息,但為了要準確傳送到目標主機,send時候要加上目的主機的ip和埠號。
import socket
#構建udp協議的socket物件
udpsocket = socket.socket(socket.af_inet,socket.sock_dgram)
data = input('>>').strip()
udpsocket.sendto(data.encode('utf-8'),('localhost',8080))
udpsocket.close()
udp程式設計服務端:
作為接收端,由於對方要發訊息過來,接收端肯定要固定乙個埠號,並且udpsocket要邦定這個埠。如果沒有固定的埠的話。那麼傳送方如果將訊息傳送到8888埠來,但是接收到的埠卻不明確,所以不能發過來。只有當接收方將8888埠作為接收訊息的埠,才能一直保持聯絡。邦定埠之後,就可以用recvfrom接收訊息了。
import socket
udpsocket = socket.socket(socket.af_inet,socket.sock_dgram)
udpsocket.bind(('',8080)) #一般寫'',表示邦定本機的任何乙個ip
data = udpsocket.recvfrom(1024)
print(data)
服務端顯示結果:
#(b'das', ('127.0.0.1', 53243))
六,udp程式設計綜合練習:乙個簡易聊天室
import socket
import threading
class wechat(object):
def __init__(self):
self.udpsocket = socket.socket(socket.af_inet,socket.sock_dgram)
self.ip = '192.168.1.105'
self.port = '8080'
def senddata(self):
'''傳送訊息'''
while true:
data = input('\r<
#發訊息的時候必須編碼為位元組型資料。由於對方主機接收軟體是gb2312解碼的,所以這裡要編碼成gb2312.
self.udpsocket.sendto(data.encode('gb2312'),(self.ip,int(self.port)))
def recvdata(self):
'''接收訊息'''
while true:
info = self.udpsocket.recvfrom(1024)
print('\r>>[%s]:%s'%(str(info[1]),info[0].decode('gb2312')))
def start(self):
self.udpsocket.bind(('',9999))
#開啟兩個執行緒,接收和傳送訊息同時進行。
ts = threading.thread(target=self.senddata)
tr = threading.thread(target=self.recvdata)
ts.start()
tr.start()
ts.join()
tr.join()
if __name__ == '__main__':
wechat = wechat()
wechat.start()
七,udp廣播
什麼是udp廣播?就是基於udp協議的廣播。例如,你傳送乙個廣播,你所在同乙個網段內的主機都可以接收到資料。原理是,首先廣播端將這乙份資訊傳送給了交換機,交換機再將資訊傳送給在每個都連上此交換機的主機上。
#寫要傳送的目的地。寫'
'可以,寫成你所在網段的網路廣播位址也行。如寫『192.168.1.255』
dest = ('
',8080)
#建立udp套接字
s = socket(af_inet,sock_dgram)
#對這個需要傳送資料的套接字進行修改設定,否則不能傳送廣播。
s.setsockopt(sol_socket,so_broadcast,1)
s.sendto(b'haha',dest)
while true:
data, addr = s.recvfrom(1024)
print('received from %s:%s'%(addr,data))
s.close()
1 1 2 10 網路程式設計1
知名埠 well known ports 知名埠是眾所周知的埠號,範圍從0到1023 80埠分配給http服務 21埠分配給ftp服務 動態埠 dynamic ports 動態埠的範圍是從1024到65535,之所以稱為動態埠,是因為它一般不固定分配某種服務,而是動態分配。動態分配是指當乙個系統程式...
五 網路程式設計 UDP 不黏包)
一 udp不黏包 會丟包 1.不黏包 丟包 udp user datagram protocol,使用者資料報協議 是無連線的,面向訊息的,提供高效率服務。不會使用塊的合併優化演算法,由於udp支援的是一對多的模式,所以接收端的skbuff 套接字緩衝區 採用了鏈式結構來記錄每乙個到達的udp包,在...
python 112 網路程式設計 Socket程式設計
例項1 客戶端發小寫英文,伺服器端返回給客戶端大寫英文 僅支援一次接受傳送 伺服器端 伺服器端 先於客戶端執行 import socket server socket.socket server.bind localhost 6969 繫結要監聽的埠,只能接受乙個引數 server.listen 監...