使用 Python 服务器和 Android 客户端进行套接字编程

yil*_*lah 5 python sockets android

我想设置一个套接字接口。PC端运行一个用Python编写的非常简单的socket服务器来测试连接:

#!/usr/bin/python           # This is server.py file

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 5000                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port

s.listen(5)                 # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print 'Got connection from', addr
   c.send('Thank you for connecting')
   c.close()                # Close the connection
Run Code Online (Sandbox Code Playgroud)

Android 客户端应用程序将连接到 PC:

package com.example.androidsocketclient;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {

    private Socket socket;

    private static final int SERVERPORT = 5000;
    private static final String SERVER_IP = "192.168.2.184";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        new Thread(new ClientThread()).start();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void onClick(View view) {
        try {
            EditText et = (EditText) findViewById(R.id.EditText01);
            String str = et.getText().toString();
            PrintWriter out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())),
                    true);
            out.println(str);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    class ClientThread implements Runnable {

        @Override
        public void run() {

            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

                socket = new Socket(serverAddr, SERVERPORT);

            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

但是,我无法在 PC 和 Android 设备之间建立连接。有什么想法可以解决这个问题吗?

nKn*_*nKn 2

由于您没有详细说明您使用的是私有还是公共 IP,因此可能是以下任一问题:

如果您使用专用连接,很明显这不是与路由器防火墙相关的问题,因为您位于同一网络下,因此只有几种可能性:

  • 服务器端该 IP 上的该端口没有任何监听
  • 服务器端的本地防火墙阻止该连接尝试
  • 您没有使用WIFI,所以不在同一个网络下。

您应该确保可以以某种方式打开该服务,这将帮助您调试罪魁祸首。如果你已经这样做了,我建议使用一些调试工具来跟踪 TCP 数据包(我也不知道你在目标计算机上使用哪种操作系统;如果是某些 Linux 发行版,tcpdump可能会有所帮助;在 Windows 下系统,WireShark可能有用)。

如果你使用的是公共IP,总结一下路由器阻塞防火墙,这意味着这个端口可能在服务器端被关闭/过滤,只需打开它即可。

android.permission.INTERNET所有这些都假设您在 AndroidManifest.xml 文件中拥有权限。