本帖最后由 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连接方式也有关系
特此分析,希望对大家有所帮助
|