要实现的东西是很基本的,但是不知道到底错在哪里。为便于描述问题,写如下代码模拟之。
故障现象:
服务器用户服务类的run()方法中的while(true)循环里面,每次接受到用户的命令都会打印出该命令;
但当客户端关闭gui窗口时候,客户端发送了cmdExit,但是服务器端没有接受到。进而引发异常。客户端流程:1.客户给服务发请求连接,建立连接
2.客户给服务器发登陆命令"cmdLogon"
3.客户收到服务器返回的登陆确认消息后,启动gui窗口。
4.客户关闭gui窗口时,同时向服务器端发送退出命令"cmdExit"客户端主程序:public class SocketManagerClient {
public static void main(String [] args)throws Exception{
Socket s = new Socket(InetAddress.getLocalHost(),5000);
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String receiveMessage;
bw.write("cmdLogon\n");
bw.flush();
receiveMessage = br.readLine();
System.out.println("receive from server:"+receiveMessage);
SocketManagerGui gui = new SocketManagerGui(s);
gui.setSize(300,300);
gui.setVisible(true);
}
}客户端gui程序:public class SocketManagerGui extends JFrame {
BufferedWriter bw;
public SocketManagerGui(Socket s) throws Exception{
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
try{
String systemCmd = "cmdExit";
System.out.println(systemCmd);
bw.write(systemCmd);
bw.flush();
System.out.println("write socket ok:"+systemCmd);
}
catch(Exception ex){
ex.printStackTrace();
}
}
});
}
}
服务器端流程:
1.服务器监听端口,发现请求,创建连接
2.启动一个线程,创建一个用户服务类,把这个类和创建的socket绑定;即:SocketManagerTask(Socket s);启动线程;
3.用户服务类够找一个while(true)时刻监听用户发来的消息,并通过check()函数解析用户消息,执行相应动作。服务器主类:public class SocketManagerServer extends Thread{
public static void main(String [] args)throws Exception{
ServerSocket ss = new ServerSocket(5000);
while (true) {
Socket s=ss.accept();
SocketManagerTask task = new SocketManagerTask(s);
task.run();
}
}
}服务器用户服务类:public class SocketManagerTask implements Runnable{
private BufferedReader br;
private BufferedWriter bw;
private String receive;
private String send;
private String cmd = null;
public SocketManagerTask(Socket s) throws Exception{
try{
this.br=new BufferedReader(new InputStreamReader(s.getInputStream()));
this.bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
}
catch(Exception e){
System.out.println("create br/bw error.");
} }
public void run(){
while(true){
try{
System.out.println("begin to receive cmd from client:");
cmd = br.readLine();
System.out.println("receive cmd from client:"+cmd);
if(cmd==null){
continue;
}
else{
check();
}
}
catch(Exception e){
System.out.println("receive cmd from client error");
} }
}
public void check(){
if(cmd.equals("cmdLogon")){
System.out.println("client logon ");
try{
bw.write("logon\n");
bw.flush();
}
catch(Exception e){
System.out.println("retrun logon message to client error.");
}
}
if(cmd.equals("cmdExit")){
System.out.println("client exit");
try{
bw.write("exit\n");
bw.flush();
}
catch(Exception e){
System.out.println("retrun exit message to client error.");
}
}
}
}
故障现象:
服务器用户服务类的run()方法中的while(true)循环里面,每次接受到用户的命令都会打印出该命令;
但当客户端关闭gui窗口时候,客户端发送了cmdExit,但是服务器端没有接受到。进而引发异常。客户端流程:1.客户给服务发请求连接,建立连接
2.客户给服务器发登陆命令"cmdLogon"
3.客户收到服务器返回的登陆确认消息后,启动gui窗口。
4.客户关闭gui窗口时,同时向服务器端发送退出命令"cmdExit"客户端主程序:public class SocketManagerClient {
public static void main(String [] args)throws Exception{
Socket s = new Socket(InetAddress.getLocalHost(),5000);
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String receiveMessage;
bw.write("cmdLogon\n");
bw.flush();
receiveMessage = br.readLine();
System.out.println("receive from server:"+receiveMessage);
SocketManagerGui gui = new SocketManagerGui(s);
gui.setSize(300,300);
gui.setVisible(true);
}
}客户端gui程序:public class SocketManagerGui extends JFrame {
BufferedWriter bw;
public SocketManagerGui(Socket s) throws Exception{
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
try{
String systemCmd = "cmdExit";
System.out.println(systemCmd);
bw.write(systemCmd);
bw.flush();
System.out.println("write socket ok:"+systemCmd);
}
catch(Exception ex){
ex.printStackTrace();
}
}
});
}
}
服务器端流程:
1.服务器监听端口,发现请求,创建连接
2.启动一个线程,创建一个用户服务类,把这个类和创建的socket绑定;即:SocketManagerTask(Socket s);启动线程;
3.用户服务类够找一个while(true)时刻监听用户发来的消息,并通过check()函数解析用户消息,执行相应动作。服务器主类:public class SocketManagerServer extends Thread{
public static void main(String [] args)throws Exception{
ServerSocket ss = new ServerSocket(5000);
while (true) {
Socket s=ss.accept();
SocketManagerTask task = new SocketManagerTask(s);
task.run();
}
}
}服务器用户服务类:public class SocketManagerTask implements Runnable{
private BufferedReader br;
private BufferedWriter bw;
private String receive;
private String send;
private String cmd = null;
public SocketManagerTask(Socket s) throws Exception{
try{
this.br=new BufferedReader(new InputStreamReader(s.getInputStream()));
this.bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
}
catch(Exception e){
System.out.println("create br/bw error.");
} }
public void run(){
while(true){
try{
System.out.println("begin to receive cmd from client:");
cmd = br.readLine();
System.out.println("receive cmd from client:"+cmd);
if(cmd==null){
continue;
}
else{
check();
}
}
catch(Exception e){
System.out.println("receive cmd from client error");
} }
}
public void check(){
if(cmd.equals("cmdLogon")){
System.out.println("client logon ");
try{
bw.write("logon\n");
bw.flush();
}
catch(Exception e){
System.out.println("retrun logon message to client error.");
}
}
if(cmd.equals("cmdExit")){
System.out.println("client exit");
try{
bw.write("exit\n");
bw.flush();
}
catch(Exception e){
System.out.println("retrun exit message to client error.");
}
}
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货