Python socket發送接收數據


客戶端:(發送數據)

import socket
import json
import time

class Client(object):
    def __init__(self):
        self.serverIp = ''
        self.serverPort = 9991
        self.bufferSize = 1024
        self.Arr = (self.serverIp, self.serverPort)
        self.client, self.addr = None, None
        # 創建socket對象,同時設置通信模式,AF_INET代表IPv4,SOCK_STREAM代表流式socket,使用的是tcp協議
        try:
            self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     
        except socket.error as e:
            print("Failed to create socket. Error: %s"%e)
        # 綁定到我們剛剛設置的ip和端口元組,代表我們的服務運行在本機的9999端口上
        self.s.bind(self.Arr)    
        # 開始監聽,5位最大掛起的連接數
        self.s.listen(5)

    def ReceiveMessage(self, predict, args, model, tokenizer):
        print('服務啟動')
        try:
            while True:
                # 接收來自服務器的數據
                print("server waiting")
                if self.client == None:
                    self.client, self.addr = self.s.accept()
                print('receive before.')
                data = self.client.recv(self.bufferSize)             
                print('receive after.')
                input_Q = str(data, encoding='utf-8')
                print('rece: ', input_Q)

                pre = predict(args, model, tokenizer, pred_text = input_Q)
                print('pre: ', pre)

                # 發送給服務器
                self.SendMessage(str(pre))    
                print('繼續接收數據.....\n')
                
        except socket.error:
            self.s.close()


    def SendMessage(self, pre):
        # 發送數據
        client = socket.socket()
        # 連接服務器
        addr = ('127.0.0.1', 9993)          # 用於發送給服務器的端口
        client.connect(addr)

        print('發送數據....')
        # 發送數據
        client.send(pre.encode('utf-8'))
        client.close()

        # client.send(pre.encode('utf-8'))

服務器(接收數據):

import socket
import time

def receiveMessage(s):
    print("server waiting")                  # 接收來自服務器的數據
    server, _ = s.accept()
    print("接收數據ing.")
    data = server.recv(1024)
    input_Q = str(data, encoding='utf-8')
    print('預測結果:', input_Q)
    
    time.sleep(6)
    print('繼續發送數據\n')


# 用來發送數據給客戶端的連接
client = socket.socket()
# 連接服務器
addr = ('127.0.0.1', 9991)
client.connect(addr)

# 用來接收客戶端的預測結果
# 創建socket對象,同時設置通信模式,AF_INET代表IPv4,SOCK_STREAM代表流式socket,使用的是tcp協議
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     
except socket.error as e:
    print("Failed to create socket. Error: %s"%e)
# 綁定到我們剛剛設置的ip和端口元組,代表我們的服務運行在本機的9999端口上
addr2 = ('127.0.0.1', 9993)                 # 用來接收客戶端數據的端口
s.bind(addr2)    
# 開始監聽,5位最大掛起的連接數
s.listen(5)
server = None 
cnt = 0
question = [
    '請問羽毛球是冬奧會項目嗎?', 
    '請問冰球是冬奧會項目嗎', 
    '請問台球好玩嗎?', 
    '請問籃球可以鍛煉身體嗎?', 
    '請問滑雪是什么運動會項目?',
    "中國冬奧會速滑可以奪冠嗎?",
    '請問小孩喜歡打籃球怎么辦?',
    '請問姚明是打什么球的?']

while True:
    if cnt == len(question):
        break
    data = question[cnt]
    cnt = cnt + 1

    # 發送數據
    client.send(data.encode('utf-8'))        # 發送給客戶端
    
    receiveMessage(s)

上面可能有問題

服務器端:

import socket
import json
import time

class Client(object):
    def __init__(self):
        self.serverIp = ''
        self.serverPort = 9991
        self.bufferSize = 1024
        self.Arr = (self.serverIp, self.serverPort)
        self.client, self.addr = None, None
        # 創建socket對象,同時設置通信模式,AF_INET代表IPv4,SOCK_STREAM代表流式socket,使用的是tcp協議
        try:
            self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     
        except socket.error as e:
            print("Failed to create socket. Error: %s"%e)
        # 綁定到我們剛剛設置的ip和端口元組,代表我們的服務運行在本機的9999端口上
        self.s.bind(self.Arr)    
        # 開始監聽,5位最大掛起的連接數
        self.s.listen(5)

    def ReceiveMessage(self, predict, args, model, tokenizer):
        print('服務啟動')
        try:   
            while True:
                # if self.client == None:
                self.client, self.addr = self.s.accept()
                data = {}
                result = ''
                text = ''
                try:
                    # while True:
                    #     t = c.recv(2048).decode('utf-8')
                    #     text += t
                    #     if t[-1] == '}':
                    #         break
                    # data = json.loads(text)
                    data = self.client.recv(self.bufferSize).decode('utf-8')
                    print('question: ', data)
                    if 'input' in data:
                        result = str(predict(args, model, tokenizer, pred_text = data))
                    else:
                        result = str(predict(args, model, tokenizer, pred_text = data))
                except Exception as e:
                    print('Exception: ', e)

                if type(result) == str:
                    result = result.encode('utf-8')
                    print('pred: ', result)
                    self.client.send(result)
                    print('返回結果成功.')
                    self.client.close()
                # self.client.close()
        except socket.error:
            self.s.close()
            self.client.close()

客戶端:

import socket
import time



client = socket.socket()

# 設置服務器端口
addr = ('127.0.0.1', 9991)
client.connect(addr)


# 創建socket對象,同時設置通信模式,AF_INET代表IPv4,SOCK_STREAM代表流式socket,使用的是tcp協議
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     
except socket.error as e:
    print("Failed to create socket. Error: %s"%e)
# 綁定到我們剛剛設置的ip和端口元組,代表我們的服務運行在本機的9999端口上
addr2 = ('127.0.0.1', 9993)                 # 用來接收客戶端數據的端口
s.bind(addr2)    
# 開始監聽,5位最大掛起的連接數
s.listen(5)
server = None 

# 接收客戶端數據
def receiveMessage(question, s):
    print("server waiting")               
    server, _ = s.accept()
    print("接收數據ing.")
    data = server.recv(1024)
    input_Q = str(data, encoding='utf-8')
    print(question, ' 預測結果:', input_Q)
    
    time.sleep(6)
    print('繼續發送數據\n')


cnt = 0
question = [
    '請問小孩咳嗽總是不好怎么辦?',
    '請問中國上一屆比賽冰球是什么名次?',
    '請問羽毛球是冬奧會項目嗎?', 
    '請問冰球是冬奧會項目嗎', 
    '請問台球好玩嗎?', 
    '請問籃球可以鍛煉身體嗎?', 
    '請問滑雪是什么運動會項目?',
    "中國冬奧會速滑可以奪冠嗎?",
    '請問小孩喜歡打籃球怎么辦?',
    '請問姚明是打什么球的?']

while True:
    if cnt == len(question):
        break
    data = question[cnt]
    cnt = cnt + 1

    # 發送數據
    print('發送數據ing....')
    client.send(data.encode('utf-8'))        # 發送給客戶端
    # receiveMessage(question[cnt-1], s)       # 接收客戶端返回的預測結果

    server_reply = client.recv(1024)
    input_Q = str(server_reply, encoding='utf-8')
    print(question[cnt-1], ' 預測結果:', input_Q)
    
    time.sleep(6)
    print('繼續發送數據\n')
    


免責聲明!

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



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