【问题标题】:Python, How to Send data over TCPPython,如何通过 TCP 发送数据
【发布时间】:2016-04-11 18:26:10
【问题描述】:

我需要创建一个简单的服务器来监听 TCP 连接。 如果它接收到文本on<EOF>off<EOF>,那么它会发送(回显)回success。接收部分正在工作,但现在我需要它发回success

代码:

# import threading
import SocketServer

class TCPHandler(SocketServer.BaseRequestHandler): 

   def handle(self):
      self.msg = self.request.recv(1024).strip()
      if self.msg == "on<EOF>":
         print "Turning On..."
         #ECHO "SUCCESS<EOF>"        <----- I need the server to echo back "success"
      if self.msg == "off<EOF>":
         print "Turning Off..."
         #ECHO "SUCCESS<EOF>"        <----- I need the server to echo back "success"


      if __name__ == "__main__": 
         host, port = '192.168.1.100', 1100

  # Create server, bind to local host and port 
  server = SocketServer.TCPServer((host,port),TCPHandler)

  print "server is starting on ", host, port

  # start server
  server.serve_forever()

【问题讨论】:

  • &gt; 是否标志着应用程序消息的结束?如果是这样,读取消息的代码在哪里?如果不是,消息是如何分隔的?

标签: python tcp server


【解决方案1】:

如果您需要无限/持续的服务器连接,您可以使用以下服务器代码。

服务器代码

    import socket  # Import socket module
    
    port = 50000  # Reserve a port for your service every new transfer wants a new port or you must wait.
    s = socket.socket()  # Create a socket object
    host = ""  # Get local machine name
    s.bind(('localhost', port))  # Bind to the port
    s.listen(5)  # Now wait for client connection.
    
    print('Server listening....')
    
    x = 0
    
    while True:
        conn, address = s.accept()  # Establish connection with client.
    
        while True:
            try:
                print('Got connection from', address)
                data = conn.recv(1024)
                print('Server received', data)
    
                st = 'Thank you for connecting'
                byt = st.encode()
                conn.send(byt)
    
                x += 1
    
            except Exception as e:
                print(e)
                break
    
    conn.close()

客户代码

    import socket  # Import socket module
    import os
    import re
    
   
    s = socket.socket()  # Create a socket object
    port = 50000  # Reserve a port for your service every new transfer wants a new port or you must wait.
    
    s.connect(('localhost', port))
    x = 0
    
    st = str(x)
    byt = st.encode()
    s.send(byt)
    
   # send message for hundred times
    while x<100:
        st = str(x)
        byt = st.encode()
        s.send(byt)
    
        print(x)
    
        while True:
            data = s.recv(1024)
            if data:
                print(data)
                x += 1
                break
    
            else:
                print('no data received')
    
    
    
    print('closing')
    s.close()
    
    

【讨论】:

    【解决方案2】:

    python 3 docs 的更好方法是:

    服务器

    import socketserver
    
    class MyTCPHandler(socketserver.BaseRequestHandler):
        """
        The request handler class for our server.
    
        It is instantiated once per connection to the server, and must
        override the handle() method to implement communication to the
        client.
        """
    
        def handle(self):
            # self.request is the TCP socket connected to the client
            self.data = self.request.recv(1024).strip()
            print("{} wrote:".format(self.client_address[0]))
            print(self.data)
            # just send back the same data, but upper-cased
            self.request.sendall(self.data.upper())
    
    if __name__ == "__main__":
        HOST, PORT = "localhost", 9999
    
        # Create the server, binding to localhost on port 9999
        server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
    
        # Activate the server; this will keep running until you
        # interrupt the program with Ctrl-C
        server.serve_forever()
    

    客户

    import socket
    import sys
    
    HOST, PORT = "localhost", 9999
    data = " ".join(sys.argv[1:])
    
    # Create a socket (SOCK_STREAM means a TCP socket)
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        # Connect to server and send data
        sock.connect((HOST, PORT))
        sock.sendall(bytes(data + "\n", "utf-8"))
    
        # Receive data from the server and shut down
        received = str(sock.recv(1024), "utf-8")
    
    print("Sent:     {}".format(data))
    print("Received: {}".format(received))
    

    希望对您有所帮助。 阿图罗

    【讨论】:

      【解决方案3】:

      好吧,我在学习一个非常好的教程前一天做了,找不到链接,但这是代码

      client.py

      import socket
      
      host = socket.gethostname()
      port = 12345                   # The same port as used by the server
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect((host, port))
      s.sendall(b'Hello, world')
      data = s.recv(1024)
      s.close()
      print('Received', repr(data))
      

      服务器端

      echo_server.py

      import socket
      
      host = ''        # Symbolic name meaning all available interfaces
      port = 12345     # Arbitrary non-privileged port
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.bind((host, port))
      
      print host , port
      s.listen(1)
      conn, addr = s.accept()
      print('Connected by', addr)
      while True:
      
          try:
              data = conn.recv(1024)
      
              if not data: break
      
              print "Client Says: "+data
              conn.sendall("Server Says:hi")
      
          except socket.error:
              print "Error Occured."
              break
      
      conn.close()
      

      【讨论】:

      • 为什么要同时使用py 2和3?用3不是更好吗?
      • 谢谢你的救命稻草
      • 谢谢你的救星。你能告诉我如何复制这个吗?我正在尝试将数据从 4-5 个客户端发送到 1 个服务器。我尝试复制客户端代码并粘贴到另一个 .py 文件中,但只要连接第一个客户端,它就不会执行
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多