与(外部)Python服务器的网络连接 [英] Network connection to (external) Python server

查看:132
本文介绍了与(外部)Python服务器的网络连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个Java客户端,该客户端应连接到python服务器.作为独立服务器,它可以很好地工作,可以建立连接,并且可以通过它发送数据.

I created a Java client, which should connect to a python server. As a standalone it works perfectly fine, connection is established and data will be sending through.

public class ClientTest {

    public static void main(String args[]) {
        requestGazeData();
    }

    public static void requestGazeData() {
        ZMQ.Context context = ZMQ.context(1);
        ZMQ.Socket request = context.socket(ZMQ.REQ);
        request.connect("tcp://xxx.x.x.x:50020");

        // Ask for the sub port
        request.send("SUB_PORT");
        String subPort = request.recvStr();
        System.out.println("subPort: " + subPort);

        // open a sub port to listen to pupil
        ZMQ.Socket subscriber = context.socket(ZMQ.SUB);
        subscriber.connect("tcp://xxx.x.x.x:" + subPort);

        String gaze = "gaze";
        subscriber.subscribe(gaze.getBytes(Charset.forName("UTF-8")));

        while (true) {
            String msg = subscriber.recvStr();
            System.out.println(msg);

            subscriber.close();
            context.term();
        }
    }
}

现在,该客户端必须在应用启动后运行,但是什么也没有发生.我没有从服务器获取任何数据,并且卡住了.从Android方面来看,这绝对是一个问题,我认为尤其是活动类.这个看起来如下:

Now this client has to run after the app started, but nothing happens. I don't get any data from the server and it get stuck. It is definitely a problem from the Android side, I reckon moreover especially the activity class. This one looks as follows:

public class MainActivity extends Activity {

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

        // Set function for button
        findViewById(R.id.button).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ClientTest.requestGazeData();
                    }
                });

    }
}

我也没有例外.在我的Manifest.xml中,放置了所有必需的权限:

I don't get an exception either. In my Manifest.xml I put all needed permissions:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

最后,我允许在防火墙端口上进行连接(通过Ubuntu中的ufw).我已经没有足够的想法来解决它并使它工作.

Lastly, I allowed the connection on the ports in my firewall (via ufw in Ubuntu). I've run out of ideas how to fix it and make it work.

更新: 由于一个可能的答案,我尝试了AsyncTask,但是仍然发生任何事情.这是我更新的活动课程:

UPDATE: Due to the one possible answer I tried the AsyncTask, but still anything happens. Here's my updated activity class:

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Set function for the button
        findViewById(R.id.connectButton).setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        new NetworkCall().execute("");
                    }
                });
    }

    private class NetworkCall extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            ZMQ.Context context = ZMQ.context(1);
            ZMQ.Socket request = context.socket(ZMQ.REQ);
            request.connect("tcp://xxx.x.x.x:50020");

            System.out.println("Connected");
            // ask for the sub port
            request.send("SUB_PORT");
            String subPort = request.recvStr();
            System.out.println("subPort: " + subPort);

            //int subPortNo = Integer.parseInt(subPort);

            // open a sub port to listen to pupil
            ZMQ.Socket subscriber = context.socket(ZMQ.SUB);
            subscriber.connect("tcp://xxx.x.x.x:" + subPort);

            String gaze = "gaze";
            subscriber.subscribe(gaze.getBytes(Charset.forName("UTF-8")));

            while (true) {
                String msg = subscriber.recvStr();
                System.out.println(msg);

                //subscriber.close();
                //context.term();
            }
        }

        @Override
        protected void onPostExecute(String result) {
            System.out.println("DONE");
        }

        @Override
        protected void onPreExecute() {}

        @Override
        protected void onProgressUpdate(Void... values) {}
    }


    @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;
    }
}

推荐答案

因此,在尝试了所有方法之后,我禁用了防火墙,最后连接正常.有时可能是很小的细节.

So after trying literally everything, I disabled the firewall and finally the connection worked. Sometimes it can be the small details.

这篇关于与(外部)Python服务器的网络连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆