与(外部)Python 服务器的网络连接
Network connection to (external) Python server
我创建了一个 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.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方面的问题,我认为尤其是activity class。这个看起来如下:
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
中,我放置了所有需要的权限:
<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)。我 运行 不知道如何修复它并使其工作。
更新:
由于一个可能的答案,我尝试了 AsyncTask
,但仍然发生任何事情。这是我更新的 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;
}
}
您不能在 Android 的主线程中调用进行网络通信的函数。您需要将此任务传递给 AsyncTask
,它将正常工作。
这是一个 AsyncTask
的示例,可能会对您有所帮助。
private class NetworkCall extends AsyncTask<String, Void, String> {
@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("");
}
});
因此,在尝试了一切之后,我禁用了防火墙,最终连接成功了。有时它可能是小细节。
我创建了一个 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.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方面的问题,我认为尤其是activity class。这个看起来如下:
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
中,我放置了所有需要的权限:
<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)。我 运行 不知道如何修复它并使其工作。
更新:
由于一个可能的答案,我尝试了 AsyncTask
,但仍然发生任何事情。这是我更新的 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;
}
}
您不能在 Android 的主线程中调用进行网络通信的函数。您需要将此任务传递给 AsyncTask
,它将正常工作。
这是一个 AsyncTask
的示例,可能会对您有所帮助。
private class NetworkCall extends AsyncTask<String, Void, String> {
@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("");
}
});
因此,在尝试了一切之后,我禁用了防火墙,最终连接成功了。有时它可能是小细节。