为什么这个Android Socket程序不起作用?

时间:2016-11-01 06:07:13

标签: android sockets

我已将Android设备连接到笔记本电脑共享的wifi。输入IP地址后,单击"确定"在Android应用程序中,我找不到任何来自Wireshark(数据包嗅探器)地址的数据包

我已将此添加到Android项目的清单中:

private boolean attemptOpenDoor(){ // Store values at the time of the login attempt. String studentId = mStudentIdView.getText().toString(); String password = mPasswordView.getText().toString(); final EditText et = new EditText(this); new AlertDialog.Builder(this).setTitle("please input IP address") .setIcon(android.R.drawable.ic_dialog_info).setView(et) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { IPAddr = et.getText().toString(); } }).setNegativeButton("cancel", null).show(); try { Socket socket = new Socket(); socket.connect(new InetSocketAddress(IPAddr, 8866), 5000); OutputStream ou = socket.getOutputStream(); ou.write((studentId+password).getBytes("UTF-8")); ou.close(); socket.close(); }catch (SocketTimeoutException aa) { //连接超时 在UI界面显示消息 AlertDialog alertDialog = new AlertDialog.Builder(LoginActivity.this).create(); alertDialog.setMessage("服务器连接失败!请检查网络是否打开"); alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); alertDialog.show(); } catch (Exception e) { e.printStackTrace(); } return true; }

Android代码:

ifelse

2 个答案:

答案 0 :(得分:0)

您应该在" onClick"。

之后移动您的连接代码
new AlertDialog.Builder(this).setTitle("please input IP address")
        .setIcon(android.R.drawable.ic_dialog_info).setView(et)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                IPAddr =  et.getText().toString();
                 try {
    Socket socket = new Socket();
    socket.connect(new InetSocketAddress(IPAddr, 8866), 5000);
    OutputStream ou = socket.getOutputStream();
    ou.write((studentId+password).getBytes("UTF-8"));
    ou.close();
    socket.close();
}catch (SocketTimeoutException aa) {
    //连接超时 在UI界面显示消息
    AlertDialog alertDialog = new AlertDialog.Builder(LoginActivity.this).create();
    alertDialog.setMessage("服务器连接失败!请检查网络是否打开");
    alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
    });
    alertDialog.show();
} catch (Exception e) {
    e.printStackTrace();
}
            }
        }).setNegativeButton("cancel", null).show();

答案 1 :(得分:0)

程序不起作用,因为当您尝试使用以下命令打开套接字时:

socket.connect(new InetSocketAddress(IPAddr, 8866), 5000);

对话框仍处于运行状态,尚未设置IPAddr的值。确保只有在用户在字段中输入有效输入后才开始连接。

另外,请注意上面的方法将阻止它运行的任何线程,直到建立连接或5秒钟,这意味着直接在OnClickListener内调用它是不明智的。你可能应该使用AsyncTask或类似的东西来避免在连接发生时阻止UI线程。