这是简单的通过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.这是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("*****客户端已退出!*****");
}
}
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("指令输入错误!请重新进行您想要的操作");
}
}
}
}
}
}
自己编的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
... //对接收到的指令进行操作,然后返回数据给客户端
}
}
}
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>
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();
......
服务器端一样改,你试试
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()不能编译通过~~
请教:是不是还缺了什么?万分感谢!!
方法是:在out.println();
后再加一句:out.flush();这样服务端就可以接收到客户端的数据了,呵呵