📄 wuzhiserver.java
字号:
import java.io.*;
import java.util.*;
import java.net.*;
import java.awt.event.*;
public class WuzhiServer
{
//以下为网络相关变量
static Vector clients=new Vector(10); //用vector向量数组存储连接客户变量
static Vector clients1=new Vector(10);
static ServerSocket server=null; //建立服务器socket
static int active_connects=0; //用来存储目前连接的客户数
static Socket socket=null; //用来存储一个套接字连接
static int one=0;
public static void main(String[] args)
{
//WuzhiServer wuzhiserver=new WuzhiServer();
//实例化一个WuzhiServer类
System.out.println("Server start ...");
try
{server=new ServerSocket(4983);
//使用端口2525初始化服务器套接字
}
catch(IOException e)
{System.out.println("Error:"+e);}
while(true)
{
if(clients.size()<5) //当客户数小于5个时开始连接
{
try
{
socket=server.accept(); //用来存储连接上的客户socket
if(socket!=null)
{
System.out.println(socket+"连接");
//在控制台打印客户连接信息
//格式:Socket[addr=/127.0.0.1,port=1024,localport=2525]连接
}
}
catch(IOException e)
{System.out.println("Error:"+e);}
int i=0;
do{
Client c=new Client(socket);
//定义并实例化一个Client线程类,一个就对应一个客户连接
clients.addElement(c);
//加入clients数组中
if(checkName(c))
//调用checkName方法验证c的合法性
{
++active_connects;
c.start();
//启动线程
notifyRoom();
//用notifyRoom方法来监视连接变化
//不断改变clients数组并刷新客户端信息
}
else
{
//如果名字不合法
//c.ps.println("TAKEN");
c.dous.println("TAKEN");
c.dous.flush();
disconnect(c);
}
i++;
break;
}
while(i<clients.size());
}
else
//如果clients数组超过了5个
{
try{Thread.sleep(200);}
catch(InterruptedException e)
{}
}
}//end of while
}/////main() over!!!!!!
/*以下实现各种方法*/
public static void notifyRoom()
//用来监视连接信息,不断刷新clients数组并刷新客户端用户列表信息
{
StringBuffer people=new StringBuffer("PEOPLE");
for(int i=0;i<clients.size();i++)
{
Client c=(Client)clients.elementAt(i);
people.append(":"+c.name);
//把所有连接的用户放在一个StringBuffer中
}
sendClients(people);
//用sendClients方法向客户端发送信息
}////over!!!
public static synchronized void sendClients(StringBuffer msg)
//实现sendClients方法专用来向每个连接的客户端发送信息
{
for(int i=0;i<clients.size();i++)
{
Client c=(Client)clients.elementAt(i);
c.send(msg);
}
}////over!!!!
public static synchronized void sendClients1(String str,StringBuffer msg)
//实现sendClients方法专用来向每个连接的客户端发送信息
{
for(int i=0;i<clients1.size();i++)
{String s=(String)clients1.elementAt(i);
if(s.equals(str))
{Client c=(Client)clients.elementAt(i);
//System.out.println("133:"+c.nam_ip+"="+str);
c.send(msg);}
//能收到数据了
// Client c=(Client)clients.elementAt(i);
//c.send(msg);
}
}////over!!!!
public static synchronized void sendQizhi(String str,StringBuffer msg)
{
for(int i=0;i<clients1.size();i++)
{
String s=(String)clients1.elementAt(i);
if(s.equals(str))
{Client c=(Client)clients.elementAt(i);
//System.out.println("133:"+c.nam_ip+"="+str);
c.send(msg);}
//能收到数据了
}
}
public static synchronized void sendClient(Socket socket,StringBuffer msg)
{
Client d=new Client(socket);
d.send(msg);
}
public static void closeAll()
//实现关闭所有连接信息
{
while(clients.size()>0)
//遍历clients数组删除所有连接客户信息
{
Client c=(Client)clients.firstElement();
String s=(String)clients1.firstElement();
try
{
c.socket.close();
}
catch(IOException e)
{
System.out.println("Error:"+e);
}
finally
{
clients.removeElement(c);clients1.removeElement(s);
}
}//end of while
}//end of closeAll method
public static boolean checkName(Client newclient)
//实现检查连接客户的socket信息是否合法
{
for(int i=0;i<clients.size();i++)
{
Client c=(Client)clients.elementAt(i);
if((c!=newclient)&&c.equals(newclient.name))
return false;
}
return(true);
}//end of checkName method
public static synchronized void disconnect(Client c)
//实现断开单个客户的方法
{
try
{
// jList1.addItem("user:"+c.name+" IP:"+c.ip+"断开连接"); //在服务器端程序的list框中显示断开信息
System.out.println("user:"+c.name+" IP:"+c.ip+"PORT"+c.port+"断开连接");
WuzhiServer.active_connects--;
//将连接数减1
c.send(new StringBuffer("QUIT"));
//向客户发送断开连接信息
c.socket.close();
}
catch(IOException e)
{
System.out.println("Error:"+e);
}
finally
{
clients.removeElement(c);
//从clients数组中删除此客户的相关socket等信息
}
}
}/////class over!!!!!
//////////////////////////////////////////////////////////////////
class Client extends Thread
//实现 Client线程类
{
Socket socket;
//用来存储一个连接客户的socket信息
String name;
//用来存储客户的连接姓名
String ip;
//用来存储客户的ip信息
String port;
//用来存储客户的PORT信息
String nam_ip;///存放地址
DataInputStream dins;
//用来实现接受从客户端发来的数据流
PrintStream dous;
//用来实现向客户端发送信息的打印流
public void send(StringBuffer msg)
//实现想客户端发送信息的方法
{
dous.println(msg);
//用打印流发送信息
dous.flush();
}
public Client(Socket s)
//Client线程类的构造器
{
socket=s;
try
{
dins=new DataInputStream(s.getInputStream());
//存储特定客户socket的输入流接受s这个客户发送到服务器端的信息
//ps=new PrintStream(s.getOutputStream());
dous=new PrintStream(s.getOutputStream());
//存储特定客户socket的输出流发送服务器给s这个客户的信息
// String info=dis.readLine();
}
catch(IOException e)
{
System.out.println("Error:"+e);
}
}//end of Client constrator
public void run()
//线程运行方法
{
while(true)
{
String line=null;
try
{
line=dins.readLine();
//读取客户端发来的数据流
}
catch(IOException e)
{
System.out.println("Error"+e);
WuzhiServer.disconnect(this);
WuzhiServer.notifyRoom();
return;
}
if(line==null) //客户已离开
{
WuzhiServer.disconnect(this);
WuzhiServer.notifyRoom();
return;
}
StringTokenizer st=new StringTokenizer(line,":");
String keyword=st.nextToken();
if (keyword.equals("INFO"))
{ name=st.nextToken();
ip=st.nextToken();
port=st.nextToken();
nam_ip=name+","+ip+","+port;
//int i=WuzhiServer.active_connects;
WuzhiServer.clients1.addElement(nam_ip);///没对其它地方修改
// System.out.println("285:"+nam_ip);
WuzhiServer.notifyRoom();
// System.out.println(head+"客户名"+name+" IP "+ip+" PORT "+port);
//在控制台打印头信息
}else
///如果有人进入房间,则初始化!!!
if(keyword.equals("ROOM"))
{StringBuffer nam=new StringBuffer("ROOM:");
String s=st.nextToken(); nam.append(s);
///用户名
if(One.one==0)
{
nam.append(":ONE");//choose the black !!!
One.one++;One.str=s;One.black=socket;
//remember the Socket
WuzhiServer.sendClients(nam);
}
else if(One.one==1)
{nam.append(":TWO");One.one++;
WuzhiServer.sendClients(nam);
StringBuffer nam1=new StringBuffer("ROOM:");
nam1.append(One.str);nam1.append(":ONE");
//把后来的用的黑方置零
//WuzhiServer.sendClient(One.black,nam1);
WuzhiServer.sendClients(nam1);//搞定
One.one++;
}
else {
nam.append(":THREE");//One.one++;
String string=nam_ip;
WuzhiServer.sendClients1(nam_ip,nam);}/////发送给自己
}
else
if(keyword.equals("QIZI"))
/////构成 :WUZHI:socket(USER:IP:PORT):F:X:Y
{String a,b,c,d,f;StringBuffer string=new StringBuffer("QIZI:");
a=" "+st.nextToken();b=st.nextToken();///空格不能少
c=st.nextToken();d=st.nextToken();
f=nam_ip+":"+b+":"+c+":"+d;
//f=a+":"+b+":"+c+":"+d;
string.append(f);
//System.out.println("325:"+f);
WuzhiServer.sendQizhi(a,string);
}
else
if(keyword.equals("QUIT"))
//如果关键字是QUIT则是客户端发来断开连接的信息
{
WuzhiServer.disconnect(this);
//服务器断开与这个客户的连接
WuzhiServer.notifyRoom();
//继续监听并刷新其他客户的人名list
this.stop();
}
}
}
} //end of class Client
class One //一号管理
{static int one;///判断坐位是否有人在
Socket white;///白方的
static Socket black;///黑方
static String str;///黑方的地址信息
public One()
{
one=0;
white=null;
black=null;
}};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -