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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Ray丶少年 中级黑马   /  2015-5-8 20:26  /  655 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Ray丶少年 于 2015-5-9 17:04 编辑

验证信息时直接 ctrl+c导致异常出现。请问各位大神,这个异常出现的原因是什么?
通过检查:是接收端,Socket流的readLine()方法抛出的异常,不知道为何会抛出该异常
  1. package demo;
  2. import java.net.*;
  3. import java.io.*;
  4. /*
  5. * 客户端通过键盘录入用户名
  6. * 服务端对这个用户名进行检验
  7. *
  8. * 如果该用户存在,在服务端显示xxx,已登陆
  9. * 在服务端显示,xxx 欢迎光临
  10. *
  11. * 如果该用户不存在,在服务端显示xxx,尝试登陆
  12. * 在客户端显示,xxx,该用户不存在
  13. *
  14. * 最多就登陆3次
  15. */

  16. //客户端
  17. public class UserLoginClient {
  18.         public static void main(String[] args) throws Exception{
  19.                 //客户端的Socket端点,指定目的主机与端口
  20.                 Socket socket = new Socket("192.168.1.104",10007);
  21.                 //读取键盘录入
  22.                 BufferedReader bufr =
  23.                                 new BufferedReader(new InputStreamReader(System.in));
  24.                
  25.                 //获取网络流(Socket流)
  26.                 PrintWriter bufOut = new PrintWriter(socket.getOutputStream(),true);//自动刷新功能
  27.                 BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  28.                
  29.                 for(int x=0;x<3;x++){
  30.                         //获取键盘录入数据
  31.                         String line = bufr.readLine();
  32.                         //没有输入任何数据(ctrl+c)
  33.                         if(line==null)
  34.                                 break ;
  35.                         //将这行数据发送的服务端,ln表示换行(结束标记)
  36.                         bufOut.println(line);
  37.                         
  38.                         //获取服务端反馈信息
  39.                         String info = bufIn.readLine();
  40.                         System.out.println("info:"+info);
  41.                         if(info.contains("欢迎")){
  42.                                 break;
  43.                         }
  44.                 }
  45.                 bufr.close();
  46.                 socket.close();//当键盘录入ctrl+c是,for循环结束,读到该句代码,给服务端发一个 -1(socket流)
  47.         }
  48. }
复制代码
  1. package demo;
  2. import java.io.*;
  3. import java.net.*;
  4. //多线程并发验证
  5. class UserThread implements Runnable{
  6.         private Socket socket;
  7.         UserThread(Socket socket){
  8.                 this.socket = socket;
  9.         }
  10.         //线程运行代码
  11.         public void run(){
  12.                 //获取IP
  13.                 String ip = socket.getInetAddress().getHostAddress();
  14.                 System.out.println(ip+"...connect");
  15.                 try{
  16.                         //验证
  17.                         for(int x=0;x<3;x++){
  18.                                 //获取网络流
  19.                                 BufferedReader bufIn =
  20.                                                 new BufferedReader(new InputStreamReader(socket.getInputStream()));
  21.                                 PrintWriter bufOut = new PrintWriter(socket.getOutputStream(),true);
  22.                                 
  23.                                 //创建字符流与硬盘 用户信息文件 相关联
  24.                                 BufferedReader bufi = new BufferedReader(new FileReader("F:\\userInfo.txt"));
  25.                                 
  26.                                 String name = bufIn.readLine();//客户端发的-1,readLine返回null,会打印null 尝试登陆
  27.                                 //所以加一个判断判断是否为null的标记
  28.                                 if(name==null){
  29.                                         break;
  30.                                 }
  31.                                 //定义标记用于验证用于信息
  32.                                 boolean flag = false;
  33.                                 
  34.                                 //验证用户信息
  35.                                 String line = null;
  36.                                 while((line = bufi.readLine())!=null){
  37.                                         if(line.equals(name)){
  38.                                                 //验证后存在,就更改标记
  39.                                                 flag = true;
  40.                                                 break;
  41.                                         }
  42.                                 }
  43.                                 //向客户端反馈信息
  44.                                 if(flag){
  45.                                         bufOut.println(name+",欢迎光临");
  46.                                         System.out.println(name+",登陆成功");
  47.                                 }else{
  48.                                         bufOut.println(name+",用户名不存在");//记得写ln啊
  49.                                         System.out.println(name+",尝试登陆");
  50.                                 }
  51.                         }
  52.                         
  53.                         socket.close();
  54.                 }catch(IOException e){
  55.                         throw new RuntimeException("登陆失败");
  56.                 }
  57.         }
  58. }

  59. //服务端
  60. public class UserLoginServer {
  61.         public static void main(String[] args) throws Exception{
  62.                 //创建服务端的Socket对象,并监听指定端口
  63.                 ServerSocket serverSocket = new ServerSocket(10007);
  64.                 while(true){
  65.                         Socket socket = serverSocket.accept();
  66.                         //每获取到一个客户端对象就开启一个新线程,以达到并发验证的目的
  67.                         new Thread(new UserThread(socket)).start();
  68.                 }
  69.         }

  70. }
复制代码






5 个回复

倒序浏览
求解答啊,看了好久都没有找到原因
回复 使用道具 举报
我在自己机子上运行你的程序没有出现问题,是不是你的userInfo.txt有问题?
回复 使用道具 举报
哥哥,你的那个代码好像符号敲得都错了 ,怎么搞
回复 使用道具 举报
本帖最后由 Ray丶少年 于 2015-5-9 17:03 编辑
ZSMAN 发表于 2015-5-9 11:49
我在自己机子上运行你的程序没有出现问题,是不是你的userInfo.txt有问题?

信息文件没问题啊,主要文件存在就可以了啊。我的文件里面写的是
zhangsan
lisi
wangwu

这个程序不是一直出问题,运行的时候运行几次 ctrl+c后就会抛异常
回复 使用道具 举报
方的黑马 发表于 2015-5-9 15:21
哥哥,你的那个代码好像符号敲得都错了 ,怎么搞

哪个位置啊,求指教
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马