本次使用的主要模塊是socket模塊,在這個模塊中可以找到socket()函數,該函數用於創建套接字對象。套接字也有自己的方法集,這些方法可以實現基於套接字的網絡通信。
socket()模塊函數
要創建套接字,必須使用socket.socket()函數,語法如下:
socket(socket_family,socket_type,protocol=0)
其中socket_family是AF_UNIX(基於文件)或AF_INET(面向網絡),socket_type是SOCK_STREAM(TCP)或SOCK_DGRAM(UDP),protocol通常省略,默認爲0
示例:創建TCP/IP套接字:
tcpSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
創建UDP/IP套接字:
udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
創建TCP時間戳服務器和客戶端
# 服務器 from socket import * from time import ctime host = '' # 爲空表示可以使用任何可用地址 port = 21567 # 監聽端口 bufsiz = 1024 # 緩衝區大小 addr = (host,port) tcpSerSock = socket(AF_INET,SOCK_STREAM) # 分配TCP服務器套接字 tcpSerSock.bind(addr) # 綁定服務器地址 tcpSerSock.listen(5) # 開啓TCP監聽器調用 try: while True: # 進入循環,等待客戶端連接 print 'waiting for connection...' tcpCliSock,addr = tcpSerSock.accept() # 出現連接請求 print '...connection from:',addr while True: data = tcpCliSock.recv(bufsiz) # 獲取消息 if not data: # 消息爲空,就退出 break tcpCliSock.send('[%s] %s'%(ctime(),data)) # 消息存在,則加上時間戳並返回數據 tcpCliSock.close() except KeyboardInterrupt: # ctrl+c退出 print 'you have CTRL+C,quit now' tcpSerSock.close()
# 客戶端 from socket import * host = 'localhost' # host,port爲服務器主機名和端口 port = 21567 bufsiz = 1024 addr = (host,port) tcpCliSock = socket(AF_INET,SOCK_STREAM) # 分配TCP客戶端套接字 tcpCliSock.connect(addr) # 主動調用並連接服務器 try: while True: data = raw_input('> ') # 輸入字符串 if not data: break tcpCliSock.send(data) # 發送到服務器 data = tcpCliSock.recv(bufsiz) # 獲取服務器數據 if not data: break print data except KeyboardInterrupt: print 'you have CTRL+C,quit now' tcpCliSock.close()
執行TCP服務器和客戶端
# 客戶端 [root@test python]# python tcp_client.py > hi [Thu Aug 11 11:11:04 2016] hi > welcome! [Thu Aug 11 11:11:10 2016] welcome! >
# 服務器端 [root@test python]# python tcp_server.py waiting for connection... ...connection from: ('127.0.0.1', 52900) waiting for connection...
創建UDP時間戳服務器和客戶端
# 服務器 from socket import * from time import ctime host = '' port = 21567 bufsiz = 1024 addr = (host,port) udpSerSock = socket(AF_INET,SOCK_DGRAM) # 分配UDP服務器套接字 udpSerSock.bind(addr) # UDP是無連接的,所以不需要監聽 try: while True: print 'waiting for message...' data,addr = udpSerSock.recvfrom(bufsiz) # 獲取消息,處理並返回客戶端 udpSerSock.sendto('[%s] %s'%(ctime(),data),addr) print '...received from and return to:',addr except KeyboardInterrupt: print 'you have CTRL+C,quit now' udpSerSock.close()
# 客戶端 from socket import * host = 'localhost' port = 21567 bufsiz = 1024 addr = (host,port) udpCliSock = socket(AF_INET,SOCK_DGRAM) # 分配UDP套接字 try: while True: # 工作方式幾乎與TCP客戶端一樣 data = raw_input('> ') if not data: break udpCliSock.sendto(data,addr) data,addr = udpCliSock.recvfrom(bufsiz) if not data: break print data except KeyboardInterrupt: print 'you have CTRL+C,quit now' udpCliSock.close()
執行結果
# 客戶端 [root@test python]# python udp_client.py > 123 [Thu Aug 11 11:23:01 2016] 123 > hello [Thu Aug 11 11:23:04 2016] hello >
# 服務器端 [root@test python]# python udp_server.py waiting for message... ...received from and return to: ('127.0.0.1', 55532) waiting for message... ...received from and return to: ('127.0.0.1', 55532) waiting for message...