【问题标题】:Android client only connecting once to server with LipeRMIAndroid 客户端仅使用 LipeRMI 与服务器连接一次
【发布时间】:2016-04-30 17:48:32
【问题描述】:

我有一个使用 LipeRMI (http://lipermi.sourceforge.net/) 连接到 Java 服务器的 Android 客户端。

为了测试这种通信,我在界面中有一个按钮,单击该按钮时会发送一个字符串“Test”。它到达服务器,服务器返回字符串。它工作正常,问题是它只工作一次。服务器只接受一次。

我的服务器代码如下:

public class TestServer implements TestService {

public TestServer() {
    try {
        CallHandler callHandler = new CallHandler();
        callHandler.registerGlobal(TestService.class, this);
        Server server = new Server();
        server.bind(7777, callHandler);
        server.addServerListener(new IServerListener() {

            @Override
            public void clientDisconnected(Socket socket) {
                System.out.println("Client Disconnected: " + socket.getInetAddress());
            }

            @Override
            public void clientConnected(Socket socket) {
                System.out.println("Client Connected: " + socket.getInetAddress());
            }
        });
        System.out.println("Server Listening");
    } catch (LipeRMIException | IOException e) {
        e.printStackTrace();
    }
}

@Override
public String getResponse(String data) {
    System.out.println("getResponse called");
    System.out.println("The information received was: " + data);

    return "Your data: " + data;
}

在 Android 客户端中,我的 MainActivity 中有以下内容:

public class MainActivity extends Activity {

private String serverIP = "192.168.3.8";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button btnGet = (Button) findViewById(R.id.send);
    btnGet.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            new Conn().execute();
        }
    });

}

class Conn extends AsyncTask<Void, Void, MainActivity> {

    @Override
    protected MainActivity doInBackground(Void... params) {
        Looper.prepare();
        try {
            CallHandler callHandler = new CallHandler();
            Client client = new Client(serverIP, 7777, callHandler);
            TestService testService = (TestService) client.getGlobal(TestService.class);

            String msg = testService.getResponse("Test");
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Looper.loop();
        return null;
    }
}

它们有共同的 TestService 接口,因此我可以使用来自服务器的方法。

如何更改服务器以便它可以多次接受来自 Android 客户端的调用?

【问题讨论】:

  • 您在计算连接数还是调用数?
  • 不,我不是。
  • 是的,因为你说服务器只接受一次。你不能不计算就知道这一点。我的问题是您将什么视为接受:连接还是调用?

标签: java android rmi


【解决方案1】:

我遇到了同样的问题,我从 AsyncTask 中删除了 doInBackground 方法中的 Looper.prepare()Looper.loop() 调用。它解决了我的问题。

【讨论】:

    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多