日期:2014-05-20  浏览次数:20716 次

java 网络 Socket 问题
总共有两个类 
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
public class ServerFrame extends JFrame implements ActionListener{
    JButton jb1,jb2;
    public ServerFrame(){
     jb1=new JButton("启动服务器");
     jb1.addActionListener(this);
     this.add(jb1);
     jb2=new JButton("关闭服务器");
     jb2.addActionListener(this);
     this.add(jb2);
     this.setLayout(new FlowLayout());
     this.setVisible(true);
     this.setSize(400, 300);
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

public static void main(String[] args) {
// TODO Auto-generated method stub
 new ServerFrame();
}

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getSource() == jb1) {
new ServerTest();// 启动服务器
} else if (e.getSource() == jb2) {
           //这里该如何关闭呢?
}

}

类 二 import java.io.IOException;
import java.net.*;
public class ServerTest {


public ServerTest()
{
ServerSocket ss=null;
try {
ss=new ServerSocket(9999);
while(true)//可相应多个用户建立连接
{
Socket s=ss.accept();

}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public static void main(String[] args) {
// TODO Auto-generated method stub

}

}
为什么我程序一运行 就是点击了 启动服务器之后 那个窗口就死了再也点不动了啊是哪里出了问题吗? 还有啊我不知道如何关闭服务器 就是点击关闭按钮之后 应该如何做出相应呢? 新手新学网络 求指教 ,帮帮忙

------解决方案--------------------
if (e.getSource() == jb1) {
用单独的线程启动,这里只是示例,如果想关闭线程最好是单独写一个线程来做这件事
new Thread(){
  public void run(){
    new ServerTest();// 启动服务器
 }
}.start();

} else if (e.getSource() == jb2) {
           //这里该如何关闭呢?

给ServerTest提供一个关闭方法,serverSocket.close()
}
------解决方案--------------------
引用:
引用:把服务器代码放到单独的线程里去,socket在监听的时候是阻塞的,所以ui会一直等待线程完成所以会一直卡着恩恩是好用的呢?  
还有一个问题哈 那我又该如何关闭服务器呢? 将服务器那端的线程全都关闭吗?服务器单方面的关闭会不会导致客户端那边抛异常啊??


==========================
用Socket通信,组织一套协议,关闭服务器时,发送信息到所有客户端,确认服务器要关闭了,至于客户端要怎么处理,就看你的业务了。
至于具体怎么做,这是业务层的处理了。