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