繁体   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