黑马程序员技术交流社区

标题: 网络编程问题 [打印本页]

作者: 王陶成    时间: 2012-9-15 18:43
标题: 网络编程问题
写了一下客户端登陆的程序,麻烦给看一下哪里出的问题


客户端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class LoginClient {
        public static void main(String[] args) throws IOException {
                Socket s = new Socket("localhost", 8000);
               
                BufferedReader bufr =
                        new BufferedReader(new InputStreamReader(System.in));
               
                PrintWriter out = new PrintWriter(s.getOutputStream(), true);               
                BufferedReader bufIn =
                        new BufferedReader(new InputStreamReader(s.getInputStream()));
               
                for(int x=0; x<3; x++) {
                        //发送信息
                        String line = bufr.readLine();
                        if(line == null)
                                break;
                        out.println(line);
                       
                        //显示服务器端反馈
                        String info = bufIn.readLine();

                        System.out.println("info : " + info);
//info是服务器端发过来的信息,为什么是null呢
                       
                        if(info.contains("欢迎"))
//在这一句报出 空指针异常
                                break;
                }
               
                bufr.close();
                s.close();
        }
}


服务器端

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

class UserThread implements Runnable {
        private Socket s;
        public UserThread(Socket s) {
                this.s = s;
        }
       
        public void run() {
                String ip = s.getInetAddress().getHostAddress();
                System.out.println("------ " + ip + " connected -------");
                try {
                        for(int i=0; i<3; i++) {
                                BufferedReader bufIn =
                                        new BufferedReader(new InputStreamReader(s.getInputStream()));
                                String name = bufIn.readLine();
                               
                                BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));
                                PrintWriter out = new PrintWriter(s.getOutputStream());

                                boolean flag =false;
                               
                                String line = null;
                                while((line = bufr.readLine()) != null) {
                                        if(line.equals(name)) {
                                                flag = true;
                                                break;
                                        }
                                }
                               
                                if(flag) {//如果flag为true
                                        System.out.println(name + ", 已登录");
                                        out.print(name + ", 欢迎光临");
                                        break;
                                } else {
                                        System.out.println(name + ", 尝试登录");
                                        out.println(name + ", 用户名不存在");
                                }
                        }
                        s.close();
                } catch (Exception e) {
                        throw new RuntimeException(ip + "校验失败");
                }
        }
       
}

public class LoginServer {
        public static void main(String[] args) throws IOException {
                ServerSocket ss = new ServerSocket(8000);
               
                while(true) {
                        Socket s = ss.accept();
                       
                        new Thread(new UserThread(s)).start();
                }
        }
}


user.txt的内容
diyige
dierge
disange





作者: 朱烈葵    时间: 2012-9-15 20:00
代码没仔细看 不过我估计  是这样出问题了  你看下 PrintWriter out = new PrintWriter(s.getOutputStream(),true);你少了自动刷新动作
作者: 史小兵    时间: 2012-9-15 20:18
仔细研究过你的代码后,你应该用PrintWriter out = new PrintWriter(s.getOutputStream(),true);在printerwriter中有缓冲的,你每次写入的东西,先是写进了缓冲区了,你应该先刷新一下缓冲区才可以让它写出去的
作者: 史小兵    时间: 2012-9-15 20:29
补充一下:
public class PrintWriter extends Writer向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
  与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。
  此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用 checkError() 是否出现错误。

作者: 王陶成    时间: 2012-9-15 21:52
我按你你什么说的改了,可是问题还有,还是空指针异常啊
作者: 王陶成    时间: 2012-9-15 21:53
我按你你们说的改了,可是问题还有,还是空指针异常啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2