与(外部)Python服务器的网络连接

我创建了一个Java客户端,它应该连接到python服务器。 作为一个独立的,它工作得非常好,建立连接并发送数据。

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.xxx: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.xxx:" + 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方面的一个问题,我还特别认为活动类。 这个看起来如下:

 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我输入了所有必需的权限:

     

最后,我允许在防火墙的端口上连接(通过Ubunt中的ufw)。 我已经没有想法如何解决它并让它工作。

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

 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 { @Override protected String doInBackground(String... params) { ZMQ.Context context = ZMQ.context(1); ZMQ.Socket request = context.socket(ZMQ.REQ); request.connect("tcp://xxx.xxx: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.xxx:" + 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; } } 

您无法调用在Android主线程中进行网络通信的function。 您需要将此任务传递给AsyncTask ,它才能正常工作。

这是一个AsyncTask的例子,它可能会对你有所帮助。

 private class NetworkCall extends AsyncTask { @Override protected String doInBackground(String... params) { Data data = ClientTest.requestGazeData(); return data.toString(); } @Override protected void onPostExecute(String result) { // Do something with your data.toString(); } @Override protected void onPreExecute() {} @Override protected void onProgressUpdate(Void... values) {} } 

现在只需单击button即可启动AsyncTask

 findViewById(R.id.button).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { new NetworkCall().execute(""); } }); 

所以在尝试了字面意思之后,我禁用了防火墙,最后连接工作了。 有时它可能是小细节。