⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wuzhiserver.java

📁 1.用applet实现一个简单的网络五子棋
💻 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 + -