python 从套接字接收数据

0 投票
4 回答
2189 浏览
提问于 2025-04-16 01:52

我在安卓模拟器上搭建了一个简单的套接字服务器。当我只向它发送数据时,一切都运行得很好。但是如果我想把数据回传给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();
                }


Python代码:



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),程序就会卡住,我想它是在等待接收数据。但是问题是,安卓代码根本没有收到发送的数据。所以我不知道该怎么办。

请注意,我对Python和套接字都很陌生。

4 个回答

0

这段Android代码是在读取行,所以你可能需要在你用Python发送的字符串末尾加上一个换行符,比如\n或者\r\n。

1

我也遇到过类似的问题,你的代码里缺少了 socket.shutdown() 这个部分:

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

你又学到新东西了……

丹尼斯

4

为了确保你的数据能够全部发送出去,而不需要关闭连接,不要使用你的套接字的 send 方法,而是要使用它的 sendall 方法!你可以查看这个文档了解 sendall...:

send() 不同,这个方法会一直发送字符串中的数据,直到所有数据都发送完或者发生错误。

而在同一页面上,关于 send 的说明是:

返回发送的字节数。应用程序需要负责检查所有数据是否都已发送;如果只有部分数据被传输,应用程序需要尝试发送剩下的数据。

撰写回答