1. 程式人生 > >Python tcp協議

Python tcp協議

Python tcp協議

tcp通訊模型中,在通訊開始之前,一定要先建立相關的連結,才能傳送資料,類似於生活中,“打電話”"
在這裡插入圖片描述
tcp伺服器
要完成一個tcp伺服器的功能,需要的流程如下:

  • socket建立一個套接字
  • bind繫結ip和port
  • listen使套接字變為可以被動連結
  • accept等待客戶端的連結
  • recv/send接收發送資料
    一個很簡單的tcp伺服器如下:
#coding=utf-8
from socket import *

# 建立socket
tcpSerSocket = socket(AF_INET, SOCK_STREAM)

# 繫結本地資訊
address = ('', 7788)
tcpSerSocket.bind(address)

# 使用socket建立的套接字預設的屬性是主動的,使用listen將其變為被動的,這樣就可以接收別人的連結了
tcpSerSocket.listen(5)

# 如果有新的客戶端來連結伺服器,那麼就產生一個新的套接字專門為這個客戶端伺服器
# newSocket用來為這個客戶端服務
# tcpSerSocket就可以省下來專門等待其他新客戶端的連結
newSocket, clientAddr = tcpSerSocket.accept()

# 接收對方傳送過來的資料,最大接收1024個位元組
recvData = newSocket.recv(1024)
print '接收到的資料為:',recvData

# 傳送一些資料到客戶端
newSocket.send("thank you !")

# 關閉為這個客戶端服務的套接字,只要關閉了,就意味著為不能再為這個客戶端服務了,如果還需要服務,只能再次重新連線
newSocket.close()

# 關閉監聽套接字,只要這個套接字關閉了,就意味著整個程式不能再接收任何新的客戶端的連線
tcpSerSocket.close()

tcp客戶端

#coding=utf-8
from socket import *

# 建立socket
tcpClientSocket = socket(AF_INET, SOCK_STREAM)

# 連結伺服器
serAddr = ('192.168.1.102', 7788)
tcpClientSocket.connect(serAddr)

# 提示使用者輸入資料
sendData = raw_input("請輸入要傳送的資料:")

tcpClientSocket.send(sendData)

# 接收對方傳送過來的資料,最大接收1024個位元組
recvData = tcpClientSocket.recv(1024)
print '接收到的資料為:',recvData

# 關閉套接字
tcpClientSocket.close()

應用:模擬QQ聊天
客戶端參考程式碼

#coding=utf-8
from socket import *

# 建立socket
tcpClientSocket = socket(AF_INET, SOCK_STREAM)

# 連結伺服器
serAddr = ('192.168.1.102', 7788)
tcpClientSocket.connect(serAddr)

while True:

    # 提示使用者輸入資料
    sendData = raw_input("send:")

    if len(sendData)>0:
        tcpClientSocket.send(sendData)
    else:
        break

    # 接收對方傳送過來的資料,最大接收1024個位元組
    recvData = tcpClientSocket.recv(1024)
    print 'recv:',recvData

# 關閉套接字
tcpClientSocket.close()

伺服器端參考程式碼

#coding=utf-8
from socket import *

# 建立socket
tcpSerSocket = socket(AF_INET, SOCK_STREAM)

# 繫結本地資訊
address = ('', 7788)
tcpSerSocket.bind(address)

# 使用socket建立的套接字預設的屬性是主動的,使用listen將其變為被動的,這樣就可以接收別人的連結了
tcpSerSocket.listen(5)

while True:

    # 如果有新的客戶端來連結伺服器,那麼就產生一個信心的套接字專門為這個客戶端伺服器
    # newSocket用來為這個客戶端服務
    # tcpSerSocket就可以省下來專門等待其他新客戶端的連結
    newSocket, clientAddr = tcpSerSocket.accept()

    while True:

        # 接收對方傳送過來的資料,最大接收1024個位元組
        recvData = newSocket.recv(1024)

        # 如果接收的資料的長度為0,則意味著客戶端關閉了連結
        if len(recvData)>0:
            print 'recv:',recvData
        else:
            break

        # 傳送一些資料到客戶端
        sendData = raw_input("send:")
        newSocket.send(sendData)

    # 關閉為這個客戶端服務的套接字,只要關閉了,就意味著為不能再為這個客戶端服務了,如果還需要服務,只能再次重新連線
    newSocket.close()

# 關閉監聽套接字,只要這個套接字關閉了,就意味著整個程式不能再接收任何新的客戶端的連線
tcpSerSocket.close()