[Python-TCP網(wǎng)絡(luò)編程]

TCP編程

在python中可以使用socket模塊進(jìn)行TCP編程

客戶端

  1. 創(chuàng)建一個(gè)套接字socket
  • 指定協(xié)議類型,使用協(xié)議IPv4或IPv6;AF_INET:表示IPv4;AF_INET6:表示IPv6
  • 指定面向流的TCP協(xié)議:SOCKET_STREAM
    import socket
    s = socket.socket(socket.AF_INET, socket.SOCKET_STREAM)
  1. 建立連接,指定需要連接的服務(wù)器地址及端口
    s.connect(('www.sina.com.cn', 80))
    連接到www.sina.com.cn,端口為80

  2. 數(shù)據(jù)收發(fā)
    發(fā)送數(shù)據(jù):使用send()
    接收數(shù)據(jù):使用recv(max) max參數(shù)表示一次最多接收的字節(jié)數(shù)

  3. 調(diào)用完成后使用close()函數(shù)關(guān)閉連接

服務(wù)器端

服務(wù)器先要綁定一個(gè)端口進(jìn)行監(jiān)聽(tīng)

每來(lái)一個(gè)客戶端連接就要?jiǎng)?chuàng)建該客戶端的socket連接,因?yàn)榉?wù)器需要區(qū)分每個(gè)客戶端,所以一個(gè)Socket依賴4項(xiàng):服務(wù)器地址、服務(wù)器端口、客戶端地址、客戶端端口來(lái)唯一確定一個(gè)Socket。

實(shí)際應(yīng)用中,并不只有一個(gè)客戶端連接服務(wù)器,因此需要使用進(jìn)程或線程來(lái)處理多個(gè)客戶端的連接

  1. 創(chuàng)建一個(gè)socket
    s = socket.socket(socket.AF_INET, socket.SOCKET_STREAM)
  2. 綁定端口
    s.bind(('127.0.0.1', 80))
    注意:'127.0.0.1'表示的是本機(jī)的IP地址,80表示端口,當(dāng)端口小于1024時(shí),需要管理員權(quán)限
  3. 監(jiān)聽(tīng)端口
    s.listen(5) # 5表示等待連接的最大客戶端數(shù)量
  4. 等待連接(該方法會(huì)阻塞,等待接收數(shù)據(jù))
    sock, addr = s.accept() # 返回客戶端套接字和地址

代碼示例:

服務(wù)器端

import threading
import socket

def tcplink(sock, addr):
    print('Accept new connection from %s:%s...' % addr)
    sock.send(b'Welcome!')
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if not data or data.decode('utf-8') == 'exit':
            break
        sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
    sock.close()
    print('Connection from %s:%s closed.' % addr)

s = socket.socket(socket.AF_INET, socket.SOCKET_STREAM)
s.bind(("127.0.0.1", 9999))
s.listen(5)
sock, addr = s.accept()
while True:
    # 接受一個(gè)新連接:
    sock, addr = s.accept()
    # 創(chuàng)建新線程來(lái)處理TCP連接:
    t = threading.Thread(target=tcplink, args=(sock, addr))
    t.start()

客戶端

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立連接:
s.connect(('127.0.0.1', 9999))
# 接收歡迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
    # 發(fā)送數(shù)據(jù):
    s.send(data)
    print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近在學(xué)習(xí)Python看了一篇文章寫得不錯(cuò),是在腳本之家里的,原文如下,很有幫助: 一、網(wǎng)絡(luò)知識(shí)的一些介紹 soc...
    qtruip閱讀 2,845評(píng)論 0 6
  • 代碼不好排版,可以到微信訂閱號(hào)(xuanhun521)查看原文。 Python黑帽編程2.8套接字編程 套接字編程...
    玄魂閱讀 700評(píng)論 1 2
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,677評(píng)論 19 139
  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,826評(píng)論 1 118
  • 兩種方法哦 1.涼鍋涼油法 鍋中倒入適量油,蔥花姜片等放入,青菜放入,稍微淋少許水,蓋上鍋蓋,開(kāi)中火,一分鐘后打開(kāi)...
    鶴舞霏揚(yáng)閱讀 160評(píng)論 0 0

友情鏈接更多精彩內(nèi)容