通过不在同一网络上的插座连接两个设备?

2024-05-20 17:59:53 发布

您现在位置:Python中文网/ 问答频道 /正文

在从事一个涉及python套接字服务器和android客户端的项目时,我不知道如何连接手机和电脑的套接字,而不让它们使用同一个网络。这对我的项目至关重要。真的有可能吗?如果是的话,是怎么做到的? 我得到的错误是连接中的ETIMEOUT,这意味着连接根本没有建立。 在下面的示例中,我至少需要看到服务器程序注意到android套接字已经尝试连接到它。你知道吗

基本Android客户端仅举一个例子:

    public class sybel extends AppCompatActivity {
    private Socket socket;
    private String serverIpAddress = "192.168.0.106";
    private static final int REDIRECTED_SERVERPORT = 7777;
    public PrintWriter out;
    public BufferedReader in ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sybel);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
        new NetBeacons().execute();
}
public class NetBeacons extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(final String... params) {
        try {
            try {
                socket = new Socket();
                socket.connect(new InetSocketAddress(serverIpAddress, REDIRECTED_SERVERPORT), 0);
                Log.d("XXX",socket.isConnected()+"");
                PrintWriter outToServer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                DataInputStream dis = new DataInputStream(socket.getInputStream());

                //here it sends the data
                outToServer.print("hi");
                outToServer.flush();
                Log.i("sybel",dis.readUTF());
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "success";
    }

    protected void onPostExecute(String result) {
        Log.d("XXX",result);

    }


    protected void onPreExecute() {


    }

    protected void onProgressUpdate(Void... values) {

    }
}

基本Python服务器:

    import socket
    import select
    server_socket=socket.socket()
    server_socket.bind(('0.0.0.0', 7777))
    server_socket.listen(5)
    open_client_sockets = []
    while True:
        rlist,wlist,xlist = select.select([server_socket]+open_client_sockets,[],[])
        for current_socket in rlist:
            if current_socket is server_socket:
                (new_socket, address) = server_socket.accept()
                open_client_sockets.append(new_socket)
            else:
                data = current_socket.recv(1024)

                if data=="":
                    open_client_sockets.remove(current_socket)
                    print "Connection with client closed"
                else:
                    print data        

非常感谢你的帮助!你知道吗


Tags: clientnewdatastringserversocketopenprivate