我尝试使用一个简单的应用程序与Jeromq库进行测试,但该工作无效。
此处的服务器:
import org.zeromq.ZMQ;
public interface ConnectionReadyListnener {
void onServerConnectionEstablished();
}
所以,在启动之后我有一个Log - " Started"。 192.168.56.1是我的本地IP地址和netstat -na(我在Windows上工作)向我显示192.168.56.1:5570正在收听。所以,我猜它没关系。我在Windows中打开了这个套接字。
然后在android上我写了这个:
建立连接的接口:
public class Connection extends AsyncTask<Void, Void, Void> {
public ConnectionReadyListnener listener=null;
public static ZMQ.Context context;
public static ZMQ.Socket socket;
@Override
protected Void doInBackground(Void... params) {
context = ZMQ.context(1);
socket = context.socket(ZMQ.DEALER);
socket.setIdentity("12345".getBytes(ZMQ.CHARSET));
socket.connect("tcp://192.168.56.1:5570");
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
listener.onServerConnectionEstablished();
}
}
然后Connection AsyckTask建立与服务器的连接:
public class MainActivity extends Activity implements ConnectionReadyListnener{
Connection connection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connection = new Connection();
connection.listener=this;
connection.execute();
}
@Override
public void onServerConnectionEstablished() {
Toast.makeText(getApplicationContext(), "connected", Toast.LENGTH_SHORT).show();
new TestAsynk().execute();
}
}
和MainActivity在建立连接时启动测试任务:
public class TestAsynk extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
Connection.socket.send("Test".getBytes(), 0);
return null;
}
}
这是TestAsynk类发送服务器应该收到的测试消息并登录到控制台:
private void TxtName_Tapped(object sender, TappedRoutedEventArgs e)
{
clickedElementName = ((TextBlock)sender).Name ;
if(clickedElementName == "element1")
{
}
}
但它从未记录结果 - 它没有收到它。问题是我不知道为什么 - 电话(真实设备)和带服务器的电脑都在一个WiFi网络中。而且我也了解到ZeroMQ无法确定连接是否真正建立。
请帮我搞清楚。
答案 0 :(得分:0)
这里有很多问题。
1)永远不要在线程之间传递套接字。 ZeroMQ中唯一的线程安全对象是Context。在线程之间传递套接字几乎肯定是问题的根源。
2)如果您在服务器端遇到问题,可能是IP地址不正确。如果可能的话,我不建议硬编码绑定一侧的IP地址。只需使用通配符&#34; *&#34;代替。所以在服务器端,它看起来像
socket.bind("tcp://*:5570");
3)你的异步模式有一个明显的错误......如果在监听器设置为Activity之前onPostExecute
运行会怎么样?至少,在你的AsyncTask中添加一个构造函数,它接受Activity ......就像
public Connection(Activity listener){
this.listener = listener;
}
4)检查权限。在过去,我需要INTERNET和ACCESS_WIFI_STATE权限。