python从套接字接收

时间:2010-07-27 00:39:23

标签: java python android sockets

所以我在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


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

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

4 个答案:

答案 0 :(得分:4)

要确保在不必关闭套接字的情况下实际发送 的所有数据,请使用套接字的send方法 - 请改用sendall方法!请the docs查看sendall ...:

  

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

send的那些,就在同一页的上方,说

  

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

答案 1 :(得分:1)

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

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

你学到新东西...... 丹尼斯

答案 2 :(得分:0)

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

答案 3 :(得分:0)

当我想将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))