python編寫socket服務器和客戶端

本次使用的主要模塊是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...


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