Note1 網路程式設計概述,UDP程式設計

2021-08-15 17:12:13 字數 3738 閱讀 6794

一,什麼是網路程式設計?

所謂的網路程式設計就是,讓在不同的電腦上的軟體能夠進行資料傳遞,即程序之間的通訊 

二,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 監...