1. 程式人生 > >TCP程式設計(二)[Python]

TCP程式設計(二)[Python]

前言

轉眼間都2019年了,首先祝大家新年快樂,也希望自己能夠堅持下去。希望自己有所為,有所愛,有所希望,有所熱愛。

《TCP程式設計(一)[Python]》中已經基本描述了Python中如何建立一個socket通訊的基本架構。本章首先給出本機通訊Client端和Server端的完整程式碼,再學習一下多執行緒,做做筆記。

正文

客戶端程式碼

import socket
HostPort = ('127.0.0.1', 9995)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(HostPort)

while True:
    Input_Message = input('>>> ').strip()
    s.send(Input_Message.encode('utf-8'))
    if len(Input_Message) == 0:
        continue
    if Input_Message in ('Quit','quit'):
        s.close()
        break
    server_reply = s.recv(1024).decode() +"  " +'From ' + HostPort[0]
    print(server_reply)

服務端程式碼

import socket
print("Waitting to be connected......")
HostPort = ('127.0.0.1',9995)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(HostPort)
s.listen(1)
conn,addr = s.accept()
while True:
    data = conn.recv(1024).decode()+"  "+'From '+HostPort[0]
    print (data)
    user_input = input('>>>')
    conn.send(user_input.encode('utf8'))

多執行緒Socket

上述的連線只是簡單單一執行緒的socket連線,意思就是隻能一收一發,一次只能傳送一條訊息,必須等待對方回覆後才能傳送下一條訊息,因此可以使用多執行緒來為每一次的通訊開一個執行緒,完成多發多收的效果。

客戶端程式碼

import socket
import threading
HostPort = ('127.0.0.1', 9994)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(HostPort)
Switch = True
def Receive(s):
    global Switch
    while Switch:
        data = s.recv(1024).decode('utf8')
        if data == 'quit':
            Switch = False
        print('Received Message:',data)

'''
建立一個新執行緒:其中
target = Receive 為執行緒函式
args[,kwargs]表示傳遞給執行緒函式的引數,必須是一個tuple型別
'''
thread = threading.Thread(target=Receive, args=(s,))
thread.start()
while Switch:
    Input_Message = input('>>>')
    s.send(Input_Message.encode('utf8'))
    if Input_Message in('quit','Quit'):
        Switch = False
s.close()

伺服器端程式碼

#匯入socket、threading多執行緒模組
import socket
import threading                                                
print("Waitting to be connected......")
HostPort = ('127.0.0.1',9994)
#建立一個socket連線
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)            
s.bind(HostPort)
s.listen(1)
socket, address = s.accept()
Switch=True
address = str(address)
print('Connecting by : %s ' % address)
#定義一個接收資料的函式
def Receive(socket):      
    #此處定義一個全域性變數Switch
    global Switch                                                 
    while Switch:
        data = socket.recv(1024).decode('utf8')
        if data == 'quit':
            true=False
        print("Received Message: " + data +" from" + address)
#例項化一個執行緒
thread=threading.Thread(target=Receive, args=(socket,))               
thread.start()                                                    
while Switch:
    Input_Message = input('>>>')
    socket.send(Input_Message.encode('utf8'))                        
    if Input_Message == 'quit':                                    
        Switch = False
s.close()

未完待續……

參考連結

https://blog.csdn.net/dyy8686/article/details/79356189#commentsedit