python的socket編程之udp編程

在上篇文章中,僅僅講述瞭如何進行了TCP編程,在本章中,將講述使用udp進行編碼,先看如下的代碼,服務器端:

root@python 513]# cat serverudp.py 
#!/usr/bin/env python

from socket import *

HOST = '192.168.1.60'
PORT = 9999

s = socket(AF_INET,SOCK_DGRAM)
s.bind((HOST,PORT))
print '...waiting for message..'
while True:
    data,address = s.recvfrom(1024)
    print data,address
    s.sendto('this is the UDP server',address)
s.close()
在上述的代碼中,只要收到了客戶端的請求,那麼就會返回固定的話,在創建的時候,只要使用SOCK_DGRAM即可創建udp的連接,在設置的時候,只要綁定地址和端口即可。

客戶端代碼如下:

#!/usr/bin/env python

from socket import *

HOST='192.168.1.60'
PORT=9999

s = socket(AF_INET,SOCK_DGRAM)
s.connect((HOST,PORT))
while True:
    message = raw_input('send message:>>')
    s.sendall(message)
    data = s.recv(1024)
    print data
s.close()

在客戶端代碼,就是直接連接,然後發送數據,接收數據即可。


具體的tcp和udp的對比如下:

1、 tcp是面向連接的,而udp是無連接,在服務器端的反應就是,tcp需要做很多的設置工作,例如要進行監聽listen,然後監聽之後,進行接收客戶端的連接,也就是accept,當接收到連接之後,傳遞過來的是客戶端的socket對象,然後利用這個socket對象進行發送接收消息。而在udp中,不需要設置這些,只要綁定了地址和端口即可,在接收數據之後,得到客戶端的地址和端口,然後服務器端的udp對象將信息發送到對應的地址。

2、在傳輸數據的方面,tcp是安全的,會將大量的數據進行分塊然後進行發送,不會造成數據丟失;而在udp中,發送多少,接收多少就是多少,不會講數據進行分塊,是將數據作爲一個包發送,至於客戶端能接收到多少數據是不管的

3、tcp在這個時候是阻塞連接的,也就是同時只有一個進行連接,而在udp中,可以進行很多連接,主要就是根據地址來進行返回相關的信息


socket簡介:

套接字的主要設計目標是爲了進程間的通信,從而就有了地址家族的AF_UNIX,是基於文件型的通信,也稱之爲IPC,inter process cominication,其實到後來,越來越多用到的是基於網絡的套接字,從而就有了地址家族的AF_INET。

而在其中的協議分之爲tcp和udp,在tcp中稱之爲流,也就是SOCK_STREAM,在udp中稱之爲數據報,也就是SOCK_DGRAM,其實也就是datagram。


一些方法的介紹:

1、 服務端方法

s.bind|()   進行綁定地址和端口

s.listen()  進行監聽

s.accept() 監聽--返回連接的socket對象和連接的客戶端地址

2、 客戶端方法

s.connet((address.port))
3、發送數據方法

s.send(string) 主要用在tcp

s.sendall(string) 主要用在tcp

s.sendto(string,address)主要用在udp根據地址發送

4、接收數據方法

s.recv(1024) 主要用在tcp表示接收到1024個字節的數據

s.recvfrom(1024) 主要用在udp,得到參數爲數據和地址,從而可以根據地址返回消息


在接收數據的時候,1024稱之爲緩衝區的數據,然而暫時並不懂啥是緩衝區,暫時保留此問題


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章