在上篇文章中,僅僅講述瞭如何進行了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稱之爲緩衝區的數據,然而暫時並不懂啥是緩衝區,暫時保留此問題