【问题标题】:Android client - Java server, Socket won't throw exceptionAndroid客户端-Java服务器,Socket不会抛出异常
【发布时间】:2014-04-11 03:36:54
【问题描述】:


我正在尝试将我的 Android APP 连接到我为它制作的 Java 服务器。

我有一个问题,服务器运行良好,连接到服务器时应用程序也运行良好。

当我关闭服务器并尝试连接到它时,问题就出现了。假设Socket.connect() 会抛出一个我会捕获的异常,但不会抛出这个异常。

我不知道我做错了什么,我把我的代码贴在这里供你阅读,也许有人可以帮助我。
感谢所有伙伴 :D

连接属性:

static Socket s;
static DataOutputStream output;
static boolean connected;

需要连接的方法:

public void enviarDatos(int r, int g, int b){

    connect();
    if(connected){
        panel.setText(panel.getText() + "\nEnviando datos...");
        try {
            output.writeUTF(r + "," + g + "," + b);
        } catch (Exception e) {
            panel.setText("Error: " + e.getMessage());
        }
        disconnect();
    } 
}

连接和断开的方法有:

public void connect(){
    try {
        s = new Socket();
        int timeout = 1000;
        s.connect(new InetSocketAddress(SERVER_ADDRESS, SERVER_PORT), timeout);
        output = new DataOutputStream(s.getOutputStream());
        connected = true;
        panel.setText("Conexion exitosa.");

    } catch (Exception e) {
        connected = false;
        panel.setText("Error: " + e.getMessage());
    }
}

public void disconnect(){
    try{
        output.close();
        s.close();
        connected = false;
    } catch(Exception e){
        panel.setText("Error: " + e.getMessage());
    }
}

【问题讨论】:

  • 您是在单独的线程中执行它吗?如果是这样,那么您无法触摸线程内的面板视图。如果不是,则主 UI 不允许您进行任何联网。但是您应该以任何方式获得例外。而不是 panel.setText 在 catch 语句中使用 e.printStackTrace()。
  • 不,那是同一个线程。当我打开服务器时,它工作正常,服务器接收到文本,一切正常,问题是我关闭服务器时。它的作用相同,就像服务器已打开一样。问题是它永远不会被捕获,因为没有抛出异常。

标签: java android sockets exception


【解决方案1】:

第一个connect() 方法与您在显示这两种方法的大代码块中发布的方法不同。目前还不清楚您使用的是哪个连接。尝试将int timeout 参数添加到connect(),如下所示:

int timeout = 1000; // 1s timeout
s.connect(new InetSocketAddress(SERVER_ADDRESS, SERVER_PORT), timeout);

这应该使connect 在超时到期后抛出IOException。

希望这能解决您的问题。

【讨论】:

  • 对不起,我复制粘贴不好 :P 应该在第一个块中的方法不是connect(),而是enviarDatos(int r, int g, int b)。
    即便如此,我会尝试一下.
  • 它一直在做同样的事情 -.- 也许我的 SDK 有错误?我每天都更新它,但我不知道......套接字不会抛出任何异常。
  • 你有没有检查过线程被s.connect(...)阻塞了,如果是,多长时间?尝试用Log.i(...) 包围方法调用,并检查Logcat 以了解实际发生的情况。调用是按规定阻塞 1000 毫秒还是无限长?
  • 好的,现在它可以在 AVD 中工作,但在我的手机中它一直在做同样的事情。知道吗?编辑:我认为它适用于 AVD,因为服务器与 AVD 托管在同一台 PC 上,并且它们共享 IP ..
  • 你的手机是什么版本的?也许 Socket 类在早期版本中的行为有所不同。试试这个:在连接后调用 s.isConnected() 并检查 Socket 是否假定它已连接。
【解决方案2】:

我在“断开连接”中发现了一个潜在问题。我认为您正在尝试在输出流仍处于打开状态时关闭套接字。在这种情况下,套接字可能无法正确关闭,这可能会导致重新打开时出现问题。虽然您应该看到在关闭期间引发了异常。

在disconnect()中,是否可以先关闭输出再关闭socket?

public void disconnect(){
    try{
        output.close();
        s.close();
        connected = false;
    } catch(Exception e){
        panel.setText("Error: " + e.getMessage());
    }
}

我没有这个问题的背景,但这是我看到的一个潜在问题。希望对您有所帮助。

【讨论】:

  • 我试过了,还是不行。我不知道我的代码有什么问题-.-它总是说:“Conexion exitosa。”,即使服务器关闭。
  • 您可以尝试将异常打印到 logcat(使用 Log.d),而不是 UI 视图吗?它有助于消除 UI 更新中的问题。希望我们能在 logcat 中看到异常。
  • 现在它可以在 AVD 中运行,但在我的手机中它仍然没有抛出异常。我认为它可以在 AVD 中工作,因为它与我的 PC 的 IP 相同,服务器在其中运行。知道吗?
  • 关闭套接字或其输入流或输出流会关闭所有内容。此答案中描述的问题完全是虚构的。
  • 好的...听起来您的设备无法看到服务器。他们在同一个网络上吗?我不确定您的网络配置。您可以尝试将 PC 服务器和 Android 设备放在同一个 wifi 网络上吗?将它们都放在同一个wifi网络上后,仔细检查服务器的IP。然后尝试从您的设备连接到服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 2018-06-24
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
相关资源
最近更新 更多