簡體   English   中英

Python套接字; 從客戶端在服務器上接收發送

[英]Python sockets; sending from client receiving on server

我正在嘗試在主機上的所有TCP / IP上發送消息。 這是可行的,盡管出於某種原因,僅需要為客戶端上的每個新消息重新初始化套接字。 例如,這是一個基本的客戶端,它發送三個單獨的消息:

import socket


host = '127.0.0.1'

class Client:
    def __init__(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def connect(self):
        self.sock.connect((host,12347))

    def send(self,message):
            self.sock.sendall(message)
    def close(self):
        self.sock.close()


if __name__ == "__main__":

    message1 = "I am message 1"
    message2 = "I am message 2"
    message3 = "I am message 3"

    #exp = Client()
    #exp.connect()

    for i in range(0,3):
        try:
            exp = Client()
            exp.connect()
            if i == 0:
                txt = message1
            elif i == 1:
                txt = message2
            elif i == 2:
                txt = message3
                exp.send(txt)
                exp.close()

            print i
            exp.send(txt)

        except:
            pass

以及接收以下內容的服務器:

#!/usr/bin/env python

import socket


class communication:


  def __init__(self):
    try:

      host = '127.0.0.1'

      self.Server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

      self.Server.bind((host,12347))

      self.Server.listen(1)

    finally:

      print "setup finished"



  def recieve(self):

    (connection, client_address) = self.Server.accept()

    data = connection.recv(128)

    return data



  def close(self):

    self.server.close()





if __name__ == "__main__":



    exp = communication()



    while True:

        try:

            (connection,client_address) = exp.Server.accept()

            message = connection.recv(128)

        finally:

            print message



        if message == "I am message 3":

          exp.close()

您將看到在for循環的每次迭代中如何重新調用Client類。 這似乎是發送消息2和3所必需的。如果套接字在主代碼的開頭僅與connect()函數一起實例化一次,則服務器在發送第一條消息后將掛在recv()上。 。

我不明白為什么會這樣,套接字只需要在服務器端設置一次即可。 我做錯了,還是正常?

謝謝!

甚至比您想像的還要糟糕。 看一下您的服務器代碼。 exp.Server.accept()接受來自客戶端的連接,但是connection.receive()會完全忽略該連接並執行第二個self.Server.accept() 您將忽略一半的連接!

接下來,您的服務器僅接收一次消息。...即使您嘗試在連接上發送更多消息,服務器也會忽略它們。

但是您不能僅僅添加一個recv循環。 您的客戶端和服務器需要某種方式來標記消息邊界,以便服務器知道如何將其拉出。 一些基於文本的系統使用換行符。 其他的則發送服務器可以讀取的消息大小或固定大小的標頭。 例如,HTTP使用新行和數據計數的組合。

如果您想從頭開始學習套接字,請知道它們很復雜,您需要學習。 有很多構建服務器的方法,您需要了解一些權衡。 否則,從XMLRPC到zeromq,有許多框架可以為您完成一些繁重的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM