以象棋服务器端代码为例://均省区了细节判断条件及界面布局
声明
public class Server extends JFrame implements ActionListener
构造方法内部做界面初始化
public Server()
单击启动按钮的效果为创建一个服务器进程
public void jbStart_event(){
this.jbStart.setEnabled(false);//将开始按钮设为不可用
this.jtfPort.setEnabled(false);//将用于输入端口号的文本框设为不可用
this.jbStop.setEnabled(true);//将停止按钮设为可用
ss=new ServerSocket(port);//创建ServerSocket对象
st=new ServerThread(this);//创建服务器线程
st.start();//启动服务器线程
}
单击关闭按钮的效果为结束服务器进程,一定要close 节约资源!
public void jbStop_event(){
Vector v=onlineList;
int size=v.size();
for(int i=0;i<size;i++)
{//向在线用户发送离线信息
ServerAgentThread tempSat=(ServerAgentThread)v.get(i);
tempSat.dout.writeUTF("<#SERVER_DOWN#>");
tempSat.flag=false;//关闭服务器代理线程
}
st.flag=false;//关闭服务器线程
st=null;
ss.close();//关闭ServerSocket
v.clear();//将在线用户列表清空
refreshList();//刷新列表
this.jbStart.setEnabled(true);//将开始按钮设为可用
this.jtfPort.setEnabled(true);//将用于输入端口号的文本框设为可用
this.jbStop.setEnabled(false);//将停止按钮设为不可用
}
服务器线程文件serverThread:
public class ServerThread extends Thread
接jbstart,将server传入到ServerThread的构造方法
public ServerThread(Server father)
{//构造器
this.father=father;
ss=father.ss;
}
start后继续执行run
public void run()
{
while(flag)
{
try
{
Socket sc=ss.accept();//等待客户端连接 ss是server的socket端口 即客户端连接到了服务器端的端口,保证了相同端口传输 然后再传给代理线程
ServerAgentThread sat=new ServerAgentThread(father,sc);//这里的father就是server。 创建代理线程
sat.start();//创建并启动服务器代理线程
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
进入到代理线程后,用the socket创建输入输出流,传输数据