这是简单的通过socket通信来选课的系统,小弟初学java就碰上Server接收不到Client的信息的问题,自己看不出问题在哪里~编译后可以运行,就是存在这个问题。
麻烦好心人看看,多谢~
1.这是client:
import java.net.*;
import java.io.*;public class Client{
protected String hostIp;
protected int hostPort;  
public static void main(String[] args) throws IOException{
InputStreamReader user_input = new InputStreamReader(System.in);
BufferedReader user_in = new BufferedReader(user_input);  //本地缓冲
String hostIp;
int hostPort;
boolean quit=false;                   /*程序运行标志*/
System.out.println("  ************************************");
System.out.println("  *欢迎使用选课及课程查询客户端程序*");
System.out.println("  ******请根据向导连接服务器********");
System.out.println("  ***管理员用户可以关闭远程服务器***");
System.out.println("  ************************************");
System.out.println("*****请输入服务器ip地址:*****");
hostIp=user_in.readLine();
System.out.println("*****请输入服务器端口:*****");                //输入服务器ip和端口
String inputPort = user_in.readLine();
hostPort=Integer.parseInt(inputPort);
Socket socket = new Socket(hostIp,hostPort);
InputStream in_stream;
OutputStream out_stream;
InputStreamReader in_streamR;
BufferedReader in; 
in_stream = socket.getInputStream();
out_stream = socket.getOutputStream();
in_streamR = new InputStreamReader(in_stream);
in = new BufferedReader(in_streamR);
PrintWriter out = new PrintWriter(out_stream);
String str,getData;
System.out.println("***请输入指令并回车确定:***");
System.out.println("**********提示*************");
System.out.println("*[获取课程服务]请使用:GETCOURSE UserID 指令(ID代表用户ID)*");
System.out.println("*[设置课程服务]请使用: SETCOURSE UserID 指令(ID代表用户名)*");
System.out.println("*[关闭远程服务]请使用: SHUTDOWN AdminID 指令");
System.out.println("*[退出服务]请使用: QUIT指令");
System.out.println("*****************************");
   while(!quit){
        
        str=user_in.readLine();               //预备发送指令str
        if (str.equals("quit")||str.equals("QUIT")){
         quit=true;
         out.println(str);//调试用,看服务端是否能接收到这条指令字符串
         }
    else{
    out.println(str);
    System.out.println("已发送指令:"+str);
    System.out.println("请等待服务器端的响应......"+"\n");
    getData=in.readLine();   //str接收服务器发送回的数据
    System.out.println(getData);
  }
    }
 socket.close();
 System.out.println("*****客户端已退出!*****");
}
}

解决方案 »

  1.   

    2.这是server.java
    import java.net.*;
    import java.io.*;
    import java.lang.*;public class Server{
    public  static void main(String[] args) throws IOException{
    boolean quit=false;                       /*程序运行标志*/
    String superPass,Admin,password;
    File directory = new File(".");
    int port;
    String tempAdmin,tempPass;
    InputStreamReader userisr = new InputStreamReader(System.in);
    BufferedReader user_in = new BufferedReader(userisr);
    System.out.println("  ************************************");  
    System.out.println("  *欢迎使用选课及课程查询服务器端程序*");
    System.out.println("  *      请根据向导启动服务器*");
    System.out.println("  ************************************");
    System.out.println("******请输入超级系统管理员认证口令******:");  
    superPass=user_in.readLine();
    if (superPass.equals("welcome")){//超级口令正确
    System.out.println("******欢迎您回来,英明的系统管理员^_^******");
      boolean quitadmin=false;
      while (!quitadmin){
    System.out.println("******您要增加新的管理者帐号吗?[y] or [n]?******");
    String option;
    option=user_in.readLine();
    if(option.equals("y")){
    System.out.println("******请输入要创建的管理员ID:******"); //设置管理员用户ID
        Admin = user_in.readLine()+".admin";  //创建一个以管理员id命名的admin文件
        File newPath = new File(directory.getCanonicalPath());
        String path=newPath.toString();
        File fAdmin=new File(path,Admin);
        if(fAdmin.exists()){//检查管理员admin文件是否存在 
        System.out.println("******该管理员已存在!******"); 
        FileReader fr=new FileReader(Admin);
       if(fr.read()==-1)//判断是否为空 ,为空即无管理员密码,危险!

    System.out.print("******!高危!该管理员没有设置密码!******");
    System.out.println("******请输入管理员密码:******");
    password = user_in.readLine(); //待完成:密码存入admin文件
    FileWriter fw=new FileWriter(Admin);
    PrintWriter out=new PrintWriter(fw);
    System.out.println("******请牢记管理员密码!******");
    out.print(password);
    out.close();
    fw.close();
    fr.close();
    }}
    else{ //可以创建该id为管理员的admin文件并设置密码
    File f1=new File(path,Admin);
    f1.createNewFile();
    System.out.println("******设置管理员帐号成功!******");
    System.out.println("******请输入管理员密码:******");
    password = user_in.readLine(); //待完成:密码存入admin文件while (password.equals("")){
    System.out.println("******管理员密码不能为空!******");
    System.out.println("******请输入管理员密码:******");
    password = user_in.readLine(); //待完成:密码存入admin文件
    }
    FileWriter fw2=new FileWriter(Admin);
    PrintWriter out2=new PrintWriter(fw2);
    out2.print(password);
    out2.close();
    fw2.close();
    }}
    else{//不创建管理员
    quitadmin=true;
    }
    }
    }
    else{//超级口令错误,您无权创建管理员!但服务器仍将运行
    System.out.println("******超级口令错误,您无权创建管理员!但服务器仍将运行******");
    }
    System.out.println("******请输入主机服务端口:******");
    String input_Port;                                      /*输入服务器所使用端口*/
    input_Port = user_in.readLine();
    port=Integer.parseInt(input_Port);  
    System.out.println(port);
    ServerSocket server=new ServerSocket(port);
       
    Socket ssocket=server.accept();   InputStream in_stream=ssocket.getInputStream();
       OutputStream out_stream=ssocket.getOutputStream();
       InputStreamReader in_streamR= new InputStreamReader(in_stream);
       BufferedReader in=new BufferedReader(in_streamR);; 
       PrintWriter out = new PrintWriter(out_stream);
    while (true){
      String str_e,str,temp;
      String name;
      FileReader fr;
    BufferedReader bufferedContentReader;
      System.out.println("******服务器已启动,正在等待客户端的消息......******"+"\n");
    System.out.println(port);
      String line=in.readLine();
      
    //line=in.readLine();                                                            //这里line没有接收到值     
      temp=line;
      System.out.println(temp);                                                      //这里有问题!貌似client有问题
    str_e=temp.substring(0,9);
    str=temp.substring(0,10);
    if (str_e.equals("shutdown ")||str_e.equals("SHUTDOWN ")){
    name=temp.substring(9,temp.length())+".admin";//获取ID.admin
      fr=new FileReader(name);
      File new_Path = new File(directory.getCanonicalPath());
      String path2=new_Path.toString();
      File f=new File(path2,name);
    if(f.exists()){//检查管理员文件是否存在 
      out.println("******该管理员已存在!******"); 
    out.println("****请输入管理员密码****");
    String pass,pw;
    pass=in.readLine();

    bufferedContentReader = new BufferedReader(fr);

    pw=bufferedContentReader.readLine();//admin文件中的真实密码
    if (pass.equals(pw)){
       out.println("管理员认证通过,即将关闭远程服务器");
       quit=true;
       fr.close();
       server.close();//关闭远程服务器
      }
    else {//无权关闭服务器
    out.println("管理员认证未通过,您无权关闭远程服务器");
    }  
    }
    else{//不是管理员id
    out.println("您所输入的不是管理员ID!无权关闭服务器");
    }
    }
    else {//要么读取课程要么设置课程或者重新操作
    name=temp.substring(10,temp.length())+".txt";  //获取user.txt
    fr=new FileReader(name);
    if(str.equals("getcourse ")||str.equals("GETCOURSE ")){//如果客户端请求是读取课程
    bufferedContentReader = new BufferedReader(fr);
    String templine;
      out.println("200 Ok");   
        while ((templine = bufferedContentReader.readLine()) != null) {
          out.println(templine);
           }
        fr.close();                                           //发送课程内容到client
    }
    else
     {
      if (str.equals("setcourse ")||str.equals("SETCOURSE ")){ //如果是设置课程
      FileWriter fw=new FileWriter(name);
          PrintWriter outfile=new PrintWriter(fw);
          String content;
          content = in.readLine(); //待完成:密码存入admin文件
          outfile.print(content);
          out.println("******课程设置成功!******");
          out.close();
          fw.close();
      }
      else {//如果以上皆非,则说明指令输入错误,重新接收操作
      out.println("指令输入错误!请重新进行您想要的操作");
      }
      }
    }
    }
    }
    }
      

  2.   

    哥们,先优化下程序,要人怎么看? 注释太少,而且都在一个main方法里?
      

  3.   

    谢谢楼上的朋友,这是整理后的代码:
    自己编的Cerver.java和Client.java不能互相通信,麻烦好心人看看,谢谢!
    这是简单的通过socket通信来选课的系统,小弟初学java就碰上Server接收不到Client的信息的问题,自己看不出问题在哪里~编译后可以运行,就是存在这个问题。  
    麻烦好心人看看,多谢~  1.这是client:
    import java.net.*;
    import java.io.*;public class Client{
     
    public static void main(String[] args) throws IOException{
    InputStreamReader user_input = new InputStreamReader(System.in);
    BufferedReader user_in = new BufferedReader(user_input);  //本地缓冲
    String hostIp;
    int hostPort; 
    boolean quit=false;                   /*程序运行标志*/
    System.out.println("  ************************************");
    System.out.println("  *欢迎使用选课及课程查询客户端程序*");
    System.out.println("  ******请根据向导连接服务器********");
    System.out.println("  ***管理员用户可以关闭远程服务器***");
    System.out.println("  ************************************");
    System.out.println("*****请输入服务器ip地址:*****");hostIp=user_in.readLine();
    InetAddress addr = InetAddress.getByName(hostIp);
    System.out.println("*****请输入服务器端口:*****");                //输入服务器ip和端口
    String inputPort = user_in.readLine();
    hostPort=Integer.parseInt(inputPort);
    Socket socket = new Socket(addr,hostPort);
    InputStream in_stream=socket.getInputStream();;
    OutputStream out_stream=socket.getOutputStream();
    InputStreamReader in_streamR=new InputStreamReader(in_stream);
    BufferedReader in=new BufferedReader(in_streamR); 
    PrintWriter out = new PrintWriter(out_stream);
    String sendData,getData;
    System.out.println("***请输入指令并回车确定:***");
    System.out.println("**********提示*************");
    System.out.println("*[获取课程服务]请使用:GETCOURSE UserID 指令(ID代表用户ID)*");
    System.out.println("*[设置课程服务]请使用: SETCOURSE UserID 指令(ID代表用户名)*");
    System.out.println("*[关闭远程服务]请使用: SHUTDOWN AdminID 指令");
    System.out.println("*[退出服务]请使用: QUIT指令");
    System.out.println("*****************************");
    while(!quit){
      sendData=user_in.readLine();               //预备发送指令str
      if (sendData.equals("quit")||sendData.equals("QUIT")){
           quit=true;
           out.println(sendData);//调试用,看服务端是否能接收到这条指令字符串;果然服务端接收不到:(  麻烦大家看看
            }
      else{
          out.println(sendData);
        //System.out.println("已发送指令:"+sendData);
          System.out.println("请等待服务器端的响应......"+"\n");
          getData=in.readLine();   //str接收服务器发送回的数据
          System.out.println(getData);
      }
        }
     socket.close();
     System.out.println("*****客户端已退出!*****");
    }
    }2.这是Server.java:
    import java.net.*;
    import java.io.*;public class Server{
    public  static void main(String[] args) throws IOException{
    boolean quit=false;                       /*程序运行标志*/
    String superPass,Admin,password;
    File directory = new File(".");
    int port;
    String tempAdmin,tempPass;
    InputStreamReader userisr = new InputStreamReader(System.in);
    BufferedReader user_in = new BufferedReader(userisr);
    System.out.println("  ************************************");  
    System.out.println("  *欢迎使用选课及课程查询服务器端程序*");
    System.out.println("  *      请根据向导启动服务器*");
    System.out.println("  ************************************");
    System.out.println("******请输入超级系统管理员认证口令******:");  
    superPass=user_in.readLine();
    if (superPass.equals("welcome")){  //超级口令正确,则可以创建管理员帐号;纯属一个功能而已
      ...
    }
    else{//超级口令错误!但服务器仍将运行
    ...
    }System.out.println("******请输入主机服务端口:******");
    String input_Port;                                      /*输入服务器所使用端口*/
    input_Port = user_in.readLine();
    port=Integer.parseInt(input_Port);  
    System.out.println(port);
    ServerSocket server=new ServerSocket(port);
    System.out.println("******服务器已启动******"+"\n");   
    Socket ssocket=server.accept();InputStream in_stream=ssocket.getInputStream();
    OutputStream out_stream=ssocket.getOutputStream();
    InputStreamReader in_streamR= new InputStreamReader(in_stream);
    BufferedReader in=new BufferedReader(in_streamR); 
    PrintWriter out = new PrintWriter(out_stream);
    String str_e,str,temp;
    String name;
    FileReader fr;
    BufferedReader bufferedContentReader;
    String line;  //接收客户端的指令
    while(true){
           System.out.println("******正在等待客户端的消息......******"+"\n");  //这里OK!
    line=in.readLine();                  //这里出了问题,没有接收到!!!!问题所在
    System.out.println(line);   //没接收到客户端指令,输出为:null
         ...   //对接收到的指令进行操作,然后返回数据给客户端
    }
    }
    }
      

  4.   

    这是运行的情况:
    1.client的运行:
    E:\java\demo>java Client
      ************************************
      *欢迎使用选课及课程查询客户端程序*
      ******请根据向导连接服务器********
      ***管理员用户可以关闭远程服务器***
      ************************************
    *****请输入服务器ip地址:*****
    127.0.0.1
    *****请输入服务器端口:*****
    8888
    ***请输入指令并回车确定:***
    **********提示*************
    *[获取课程服务]请使用:GETCOURSE UserID 指令(ID代表用户ID)*
    *[设置课程服务]请使用: SETCOURSE UserID 指令(ID代表用户名)*
    *[关闭远程服务]请使用: SHUTDOWN AdminID 指令
    *[退出服务]请使用: QUIT指令
    *****************************
    quit
    *****客户端已退出!*****E:\java\demo>2.Server.java的运行:
    E:\java\demo>java Server
      ************************************
      *欢迎使用选课及课程查询服务器端程序*
      *      请根据向导启动服务器*
      ************************************
    ******请输入超级系统管理员认证口令******:******超级口令错误,您无权创建管理员!但服务器仍将运行******
    ******请输入主机服务端口:******
    8888******服务器已启动************正在等待客户端的消息......******null                            //这里偏偏输出null,而不是客户端输入的quit
    Exception in thread "main" java.lang.NullPointerException
            at Server.main(Server.java:110)E:\java\demo>
      

  5.   

    InputStream in_stream=socket.getInputStream();;
    OutputStream out_stream=socket.getOutputStream();
    InputStreamReader in_streamR=new InputStreamReader(in_stream);
    BufferedReader in=new BufferedReader(in_streamR); 
    PrintWriter out = new PrintWriter(out_stream);改为
    DataOutputStream dos=socket.getOutputStream();
    DataInputStream dis=socket.getInputStream();
    String in=dis.readUTF();
    ......
    服务器端一样改,你试试
      

  6.   

    首先谢谢楼上的回复!但是,
    InputStream in_stream=socket.getInputStream();
    OutputStream out_stream=socket.getOutputStream();
    InputStreamReader in_streamR=new InputStreamReader(in_stream);
    BufferedReader in=new BufferedReader(in_streamR); //后面要调用str=in.readLine()
    PrintWriter out = new PrintWriter(out_stream);  //向客户端发送数据要用out.println();改为
    DataOutputStream dos=socket.getOutputStream();
    DataInputStream dis=socket.getInputStream();
    String in=dis.readUTF();不行啊~因为原来server.java中的out.println();和修改后的in.readUTF()不能编译通过~~
    请教:是不是还缺了什么?万分感谢!!
      

  7.   

    这个问题已经解决!呵呵,谢谢各位
    方法是:在out.println();
    后再加一句:out.flush();这样服务端就可以接收到客户端的数据了,呵呵