A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 wenhb 于 2017-8-31 15:27 编辑

网络编程学习中,有个模拟登录的小案例,中间发现了个小问题,特别分享一哈

先贴上代码
第一个是发送端代码:
[Java] 纯文本查看 复制代码
public class Sender {
        public static void main(String[] args) throws IOException {
                Socket  s  = new Socket("localhost", 6200);
                
                System.out.println("sender s : " + s);
                
                while (true) {
                        Scanner sc = new Scanner(System.in);
                        System.out.println("请输入账号");
                        String line1 = sc.nextLine();
                        System.out.println("请输入密码");
                        String line2 = sc.nextLine();
                        PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
                        pw.println(line1);
                        pw.println(line2);
                        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                        String over = br.readLine();
                        if (over.equals("登陆成功")) {
                                System.out.println(over);
                                break;
                        }
                        System.out.println(over);
                }
                s.close();
        }
}

接着是接收端代码:
[AppleScript] 纯文本查看 复制代码
public class Servers {
        public static void main(String[] args) throws IOException {
                ServerSocket  ss = new ServerSocket(6200);
//                        while (true) {
//                                System.out.println("----");
                                
                                while (true) {
                                        Socket accept = ss.accept();
                                        BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
                                        String name = br.readLine();
                                        String password = br.readLine();
                                        System.out.println(name+"----"+password);
                                        boolean flag = false;
                                        List<User> list = UserDB.getList();
                                        if (list.contains(new User(name, password))) {
                                                flag = true;
                                        }
                                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
//                                        PrintWriter pw = new PrintWriter(accept.getOutputStream(), true);
                                        if (flag) {
//                                                pw.println("登陆成功");
                                                bw.write("登陆成功");
                                                System.out.println(accept.getInetAddress().toString()+"登陆成功");
                                                bw.newLine();
                                                bw.flush();
                                                break;

                                        } else {
//                                                pw.println("登陆失败");
                                                bw.write("登陆失败");
                                                System.out.println(accept.getInetAddress().toString()+"登陆失败");
                                                bw.newLine();
                                                bw.flush();
                                        }

                        }
                                //                
//                        }
        }
}



运行的时候,期望效果是想重复输入知道帐号密码正确停止,但发现运行判断一次之后就会陷入静默状态,不再执行判断了,
下面是执行的结果


然后分析了下代码
在接受端中
  while (true) {
                                        Socket accept = ss.accept();

                                      ....
                        }

在循环里监听访问事件,
又查看了在发送端中
Socket  s  = new Socket("localhost", 6200);
               
                System.out.println("sender s : " + s);
               
                while (true)  {
                             ......
                }

Socket 是在while循环外部创建的,那么在发送信息的时候用的是同一个Socket,
在和接收端通信中,已经保持了和这个Socket的联系,就不会在执行 ss.accept();方法,
导致了程序在这句代码中一直保持阻塞状态,因此程序在第二次输入信息的时候没有任何反应,
当然和tcp连接方式也有关系
特此分析,希望对大家有所帮助

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马