socket實現簡單TCP循環通信(Python)


一、socket通信過程

TCP服務器端創建套接字 --> 綁定IP地址和端口 --> 監聽客戶端連接請求 --> 接收客戶端連接(建立客戶端連接) --> 阻塞直到有客戶端連接 --> 處理請求(通信循環) --> 關閉連接 --> 關閉套接字

TCP客戶端創建套接字 --> 連接服務端IP以及端口 --> 處理請求(通信循環) --> 關閉套接字

二、套接字函數

1.服務端套接字函數

s.bind(address)

將套接字綁定到地址,在AF_INET下,以元組(host,port)的形式表示地址。

s.listen(backlog)

開始監聽TCP傳入連接。backlog指定在拒絕連接之前,操作系統可以掛起的最大連接數量。該值至少為1,大部分應用程序設為5就可以了。

s.accept()

接受TCP連接並返回(conn,address),其中conn是新的套接字對象,可以用來接收和發送數據。address是連接客戶端的地址。

2.客戶端套接字函數

s.connect(address)

連接到address處的套接字。一般address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。

3.公共套接字函數

s.recv(bufsize[,flag])

接受TCP套接字的數據。數據以字符串形式返回,bufsize指定要接收的最大數據量。flag提供有關消息的其他信息,通常可以忽略。

s.send(string[,flag])

發送TCP數據。將string中的數據發送到連接的套接字。返回值是要發送的字節數量,該數量可能小於string的字節大小。

s.close()

關閉套接字。

三、代碼實現(版本一)

實現效果:客戶端單方面發送消息,服務端顯示客戶端發送的消息

server. py

import socket

# 創建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 綁定ip地址與端口號
sock.bind(('127.0.0.1', 8080))

# 建立監聽,最大連接數為5個
sock.listen(5)

# 接收客戶端的連接
conn, client_addr = sock.accept()

# 通訊循環
while True:
    # 接收消息
    msg = conn.recv(1024)  # 最大接收字節數為1024
    if not msg:
        continue
    print('client is sending: ' + msg.decode('utf-8'))

# 斷開連接
conn.close()

# 關閉套接字
sock.close()

client. py

import socket

# 創建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 連接服務端
sock.connect(('127.0.0.1', 8080))

# 建立通訊循環
while True:
    msg = input('Enter your message: ')
    if msg == 'quit':
        print('communication ended')
        break
    sock.send(msg.encode('utf-8'))  # Mac操作系統使用utf-8編碼方式

# 斷開連接
sock.close()

先運行server,再運行client

運行效果:(p1 client,p2 server)

四、代碼實現(版本二)

服務端客戶端互發消息

server

import socket

# 創建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 綁定ip地址與端口號
sock.bind(('127.0.0.1', 8081))

# 建立監聽,最大連接數為5個
sock.listen(5)

# 接收客戶端的連接
conn, client_addr = sock.accept()

# 通訊循環
while True:
    # 接收消息
    msg = conn.recv(1024)  # 最大接收字節數為1024
    if not msg:
        continue
    print('client is sending: ' + msg.decode('utf-8'))
    reply = input('reply: ')
    conn.send(reply.encode('utf-8'))

# 斷開連接
conn.close()

# 關閉套接字
sock.close()

client

import socket

# 創建套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 連接服務端
sock.connect(('127.0.0.1', 8081))

# 建立通訊循環
while True:
    msg = input('Enter your message: ')
    if msg == 'quit':
        print('communication ended')
        break
    sock.send(msg.encode('utf-8'))  # Mac操作系統使用utf-8編碼方式
    reply = sock.recv(1024)
    print('server is sending: ' + reply.decode('utf-8'))

# 斷開連接
sock.close()

先運行server,再運行client

運行效果:(p1 client,p2 server)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM