【问题标题】:python receiving from a socketpython从套接字接收
【发布时间】:2010-07-27 00:39:23
【问题描述】:

所以我在 android 模拟器上有一个简单的套接字服务器。当我只向它发送数据时,它工作得很好。但是,如果我想将该数据回显到 python 脚本,它根本不起作用。这是有效的代码:

机器人:

try { serverSocket = new ServerSocket(port); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } while (checkingForClients) { try { clientSocket = serverSocket.accept(); out = new PrintWriter(clientSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader( clientSocket.getInputStream())); line = null; while ((line = in.readLine()) != null) { Log.d("ServerActivity", line); /* THIS IS THE LINE THAT DOESN'T WORK*/ //out.println(line); handler.post(new Runnable() { @Override public void run() { if(incomingData == null){ Log.e("Socket Thingey", "Null Error"); } //out.println(line); incomingData.setText("Testing"); incomingData.setText(line); } }); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }

蟒蛇:

import socket host = 'localhost' port = 5000 size = 1024 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host,port)) s.send('Hello, World!') # data = s.recv(size) THIS LINE CAUSES PROBLEMS s.close() print 'Received:' , data

所以有 2 行注释。没有这些线条,它可以完美运行。但是,如果我在 python 中添加s.recv(size),它只会冻结,我假设等待接收到的数据。但问题是android代码永远不会得到发送的数据。所以我不知道该怎么办。

请记住,我是 python 和套接字的新手。

【问题讨论】:

    标签: java python android sockets


    【解决方案1】:

    为了确保您的所有数据实际上确实在不必关闭套接字的情况下发送,请不要使用套接字的send 方法——使用它的sendall 方法代替!看the docssendall...:

    与 send() 不同,此方法继续 从字符串发送数据,直到 所有数据已发送或出现错误 发生。

    而对于send 的那些,就在同一页面的上方,比如说

    返回发送的字节数。 应用程序负责 检查所有数据是否已发送; 如果只有一些数据是 传输,应用程序需要 尝试交付剩余的 数据。

    【讨论】:

      【解决方案2】:

      我遇到了一些问题,您在代码中错过了 socket.shutdown():

      s.send('Hello, World!')
      s.shutdown(1)
      data = s.recv(size)
      s.close() 
      print 'Received:' , data
      

      你学到了一些新东西...... 丹尼斯

      【讨论】:

        【解决方案3】:

        Android 代码正在读取行,因此您可能需要在 Python 发送字符串的末尾发送一个 \n 或可能是 \r\n。

        【讨论】:

          【解决方案4】:

          当我想recv() 数据从 java 到 python 时,我遇到了同样的错误。 所以,我认为 python connect.send() 不停地等待其他进程 尝试将s.shutdown(1) 放在s.send() 之后,如下所示:-

          sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          sock.bind(("192.168.1.8", 2307))
          sock.listen()
          con, adr = sock.accept()
          con.sendall(b"download test.txt")
          con.shutdown(1)
          print(con.recv(4096))
          

          【讨论】:

            最近更新 更多