有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android客户端无法打开C服务器的socket

我找不到关于这个非常具体的问题的任何信息,但可能是其他人做的

我有一个用C编写的服务器程序(为了可读性,已删除错误检查):

int main(int arc, char *argv[])
{
    int sockfd, newsockfd, portnum, cli_len, num_chars, n;

    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;

    // Set up the socket
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    // Set up our variables
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portnum = atoi(argv[1]);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(portnum); // Convert from host port to network port
    serv_addr.sin_addr.s_addr = INADDR_ANY;

    if(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
        error("Socket could not be bound");

    listen(sockfd, 5); // Get ready to receive connections

    cli_len = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &cli_len);

    // Message processing

    return 0;
}

同时,我有Android客户端(版本4.1.2):

private class ClientTask extends AsyncTask<String, Void, Void> {

        @Override
        protected Void doInBackground(String... params) {
            try {
                InetAddress a = InetAddress.getByAddress(new byte[] {(byte) 192, (byte) 168, 1, (byte) 102});
                sock = new Socket(a, 65053);
                BufferedReader inFromServer = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                DataOutputStream outToServer = new DataOutputStream(sock.getOutputStream()); 

                // Message processing

            } catch (UnknownHostException e) {
                System.out.println("No address found for ");
            } catch (IOException e) {
                System.out.println("Failed to open socket");
            }
            return null;
        }
    }

我遇到的问题是Android客户端无法打开socket。我总是在超时后得到“无法打开socket”。安卓客户端与我拥有的java服务器一起工作,我拥有的java客户端至少与C服务器建立了连接。我不明白会出什么问题

如果您需要更多详细信息或附加代码,请告诉我


共 (2) 个答案

  1. # 1 楼答案

    您不需要指定是否在同一个LAN下同时运行两个设备(服务器和客户端),在这种情况下,您可以放弃连接问题。如果不是,这可能是一个测试。如果你能在同一个路由器下将你的客户机连接到你的服务器,那就意味着在其他情况下(即,使用你的公共IP),有东西阻止了它,可能是你的路由器。另一个问题可能是病毒使用、操作系统端口阻塞、路由器端口阻塞

    如果你不能在同一个路由器连接下同时连接两个路由器,那肯定是代码问题。由于您不知道罪魁祸首在哪里,我建议在连接代码段两侧的客户端代码和服务器代码中放置几行Log.d()语句,看看瓶颈在哪里,或者使用一些调试工具并放置一些断点

    编辑

    尝试以下方式连接:

    Socket socket;
    final String host = "192.168.1.X";
    final int port = 65053;
    final int timeout = 30000;   // 30 seconds
    
    try {
      socket = new Socket();
      socket.connect(new InetSocketAddress(host, port), timeout);
    }
    catch (UnknownHostException uhe) {
      Log.e("Sock", "I couldn't resolve the host you've provided!");
    }
    catch (SocketTimeoutException ste) {
      Log.e("Sock", "After a reasonable amount of time, I'm not able to connect!");
    }
    catch (IOException ioe) {
      Log.e("Sock", "Hmmm... Sudden disconnection, probably you should start again!");
    } 
    
  2. # 2 楼答案

    小家伙,这是防火墙问题,够尴尬的了。显然Eclipse通过了我的防火墙,这就是Java服务器工作的原因,但当我通过命令行运行我的C代码时,我一定错过了提示。我禁用了我的防火墙,它立即工作了