《python核心編程》之“網絡編程”

本文主要是使用socket模塊。

模塊函數socket()

要創(chuàng)建套接字,必須使用 socket.socket()函數。該函數的語法如下:

socket.socket(socket_family, socket_type, protocol=0)

其中socket_family 是地址簇,可為以下值:

  • AF_UNIX
  • AF_INET(IPv4)

socket_type 為類型,可為以下值:

  • SOCK_STREAM (使用 TCP 傳輸控制協(xié)議)
  • SOCK_DGRAM(使用 UDP 傳輸控制協(xié)議)

創(chuàng)建TCP實例代碼如下:

from socket import  *
tcpSerSock = socket(AF_INET, SOCK_STREAM)

創(chuàng)建失敗會拋出socket.error異常,這里需要進行捕獲。

from socket import *
import sys

try:
    tcpSerSock = socket(AF_INET, SOCK_STREAM)
    print "Created"
except error as err:
    print err
        sys.exit()

內置方法(常用)

名稱 描述
服務器套接字方法
s.bind() 將地址(主機、端口對)綁定到套接字
s.listen() 設置并啟動TCP監(jiān)聽
s.accept() 被動接受TCP客戶端連接,一直等待,直到連接到達(阻塞)
客戶端套接字方法
s.connect() 主動發(fā)起TCP服務器連接
公共用途的套接字方法
s.resv() 接受TCP消息
s.send() 發(fā)送TCP消息
s.close() 關閉套接字
s.getsockname() 當前套接字的地址

創(chuàng)建一個TCP服務器(這里是簡單的單線程)

TCP服務器會等待請求,一旦接收到一個連接,accept() 函數就會返回一個單獨的客戶端套接字用戶后續(xù)的通訊。當客戶端關閉連接后,服務器繼續(xù)等待下一個客戶的連接。

文件 tsTserv.py創(chuàng)建一個TCP服務器程序,將客戶端發(fā)來的字符串加上時間戳返回給客戶端。

from socket import *
from time import ctime

HOST = '127.0.0.1'  # 運行在本機上,這里的HOST填寫127.0.0.1或localhost
PORT = 21567  # 端口號
BUFSIZ = 1024  # 數據大小
ADDR = (HOST, PORT)

# 地址簇 : AF_INET (IPv4), 類型: SOCK_STREAM (使用 TCP 傳輸控制協(xié)議)
tcpSerSock = socket(AF_INET, SOCK_STREAM)  
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:  # 無線循環(huán)
    print 'waiting for connection...'
    tcpCliSock, addr = tcpSerSock.accept()
    print '...connected from:', addr

    while True:
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        tcpCliSock.send('[%s] %s' % (ctime(), data))
    tcpCliSock.close()
tcpSerSock.close()

創(chuàng)建TCP客戶端

客戶端文件 tsTclnt.py提示用戶輸入要傳給服務器的信息,然后顯示服務器返回的數據。

from socket import *

HOST = '127.0.0.1'  # 在本機運行就要和tsTserv.py中相同,在其他機器運行,就要填寫服務器所在的ip
PORT = 21567  # 端口號必須和以上保持一致
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)

while True:
    data = raw_input(">")
    if not data:  # 用戶無輸入,則關閉客戶端
        break
    tcpCliSock.send(data)
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print data
tcpCliSock.close()

運行客戶端和TCP服務器

需要先啟動服務器,然后再啟動客戶端。

這是測試結果:


image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容