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

📄 serverlist.java

📁 本程序可在局域网内实现聊天、传送文件功能
💻 JAVA
字号:
package org.tuna.net.csuim;

import java.io.*;
import java.net.*;
import java.util.*;
import org.tuna.net.encode.*;

public class ServerList extends Thread
{
	//private ArrayList users;    //for jdk1.4
	private ArrayList<User> users;
	//private ArrayList userAdapters;    //for jdk1.4
	private ArrayList<UserListener> userListeners;
	private DatagramSocket sock;
	private int port;
	private boolean stop;
	private String[] toClient;
	
	public ServerList(int p) throws Exception
	{
		//users = new ArrayList();    //for jdk1.4
		users = new ArrayList<User>();
		load();
		userListeners = new ArrayList<UserListener>();
		port = p;
		sock = new DatagramSocket(port);
		toClient = new String[]{"ID", "online"};
		stop = false;
		this.start();
	}
	
		
	//  -----  for thread  -----
	public void run()
	{
		try{			
			while( !stop ){
				byte[] rcvByte = new byte[512];
				DatagramPacket rcvpkt = new DatagramPacket(rcvByte, rcvByte.length);
				this.sock.receive(rcvpkt);
				byte[] b = new byte[rcvpkt.getLength()];
		    System.arraycopy(rcvByte, 0, b, 0, rcvpkt.getLength());
		    String cmdstr = UTF16Encoder.decode(b).trim();
		    User client = new User(cmdstr.substring(1));
		    client.add("addr", rcvpkt.getAddress().getHostAddress());
		    execute(cmdstr.charAt(0), client);
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
	
		
	// -----  Public Methods  -----
	public void addUserListener(UserListener ul)
	{
		userListeners.add(ul);
	}
	
	public void close()
	{
		this.stop = true;
		try{
			User exit = new User("exit", false);
			byte[] b = UTF16Encoder.encode('0' + exit.toString());
			this.sock.send(new DatagramPacket(b, b.length, InetAddress.getLocalHost(), this.port));
			Thread.sleep(1000);
			this.sock.close();
			save();
		}catch(Exception e){}
	}
	
	public int countUsers()
	{
		return users.size();
	}
	
	public boolean isUserExist(String id)
	{
		if ( getUserNumberInList(id) == -1 )
		   return false;
		else 
		   return true;
	}
	
	public User[] listAll()
	{
		if (users.size() == 0) 
		  return null;
		else
		  return users.toArray(new User[users.size()]);
	}
	
	/**
	 * 从文件载入用户信息,并存入列表中
	 */
	public void load()
	{
		try{
			File f = new File("srv_users.dat");
			if ( !f.exists() )
			   f.createNewFile();
			BufferedReader in = new BufferedReader(new FileReader(f));
			String temp;
			while( (temp = in.readLine()) != null ){
				try{
					User u = new User(temp);
					u.update("online", "false");
					users.add(u);
				}
				catch(UserCreateException ucex){
					continue;
				}
			}
		}
		catch(IOException ioex){
			System.out.println("Load users error!");
		}
	}
	
	/**
	 * 将当前用户列表中用户信息保存至文件
	 */
	public void save()
	{
		try{
			FileWriter fw = new FileWriter("srv_users.dat");
			for(int i = 0; i < users.size(); i++)
			   fw.append(users.get(i).toString() + "\r\n");
			fw.close();
		}
		catch(IOException ioex){
			System.out.println("Save users error!");
		}
	}
	
  public void setAvialableToClient(String[] s)
  {
  	toClient = s;
  }
	
	public User[] toArray()
	{
		if (users.size() == 0) 
		  return null;
		else
		  return users.toArray(new User[users.size()]);
	}
	
	
	//------  Private Method  ---------	
	private void activeCreateNewEvent(User u)
	{
		for(int i = 0; i < userListeners.size(); i++)
		   userListeners.get(i).createNewPerformed(u);
	}
	
	private void activeLeaveEvent(User u)
	{
		for(int i = 0; i < userListeners.size(); i++)
		   userListeners.get(i).leavePerformed(u);
	}
	
	private void activeOnlineEvent(User u)
	{
		for(int i = 0; i < userListeners.size(); i++)
		   userListeners.get(i).onlinePerformed(u);
	}
		
	private void activeUpdateEvent(User u)
	{
		for(int i = 0; i < userListeners.size(); i++)
		   userListeners.get(i).updatePerformed(u);
	}
		
	private void execute(char cmd, User u)
	{
		switch(cmd)
		{
			case TransData.APPLY_ID:
			   validateID(u);
			   break;
			case TransData.ASK_FOR_ALL:
			   postAll(u);
			   break;
			case TransData.USER_ONLINE:
			   online(u);
			   break;
			case TransData.USER_LEAVE:
			   leave(u);
			   break;
			case TransData.USER_UPDATE:
			   update(u);
			   save();
			   break;			
		}
	}
	
	private int getUserNumberInList(String id)
	{
		for(int i = 0; i < users.size(); i++)
		   if ( users.get(i).value("ID").equals(id) )
		      return i;
	  return -1;
	}
	
	//将此用户的动作发送给所有其它用户
	private void informAllUser(char cmd, User u)
	{
		byte[] b = UTF16Encoder.encode(cmd + u.toString(toClient));
		for( int i = 0; i < users.size(); i++ ){
			if ( users.get(i).value("online").equals("true") ){
			  try{
				  InetAddress clientAddress = InetAddress.getByName(users.get(i).value("addr"));
				  int clientPort = Integer.parseInt(users.get(i).value("onPort"));
				  this.sock.send(new DatagramPacket(b, b.length, clientAddress, clientPort));
		    }
		    catch(Exception e){}
		  }
		}
	}
		
	private void leave(User u)
	{
		if ( isUserExist(u.value("ID")) ){
		   users.get(getUserNumberInList(u.value("ID"))).update("online", "false");
		   activeLeaveEvent(u);
		   informAllUser(TransData.USER_LEAVE, u);
		}
	}
	
	private void online(User u)
	{
		u.update("online", "true");
		if ( isUserExist(u.value("ID")) ){	 
		   users.get(getUserNumberInList(u.value("ID"))).update(u);
		   activeOnlineEvent(u);
		}
		else{
			this.users.add(u);
			activeCreateNewEvent(u);
		}
		save();
		informAllUser(TransData.USER_ONLINE, u);
	}
	
	//将当前所有用户发送给一个人
	private void postAll(User u)
	{
		try{
		  InetAddress clientAddress = InetAddress.getByName(u.value("addr"));
			int clientPort = Integer.parseInt(u.value("onPort"));
		  for(int i = 0; i < users.size(); i++){
			  byte[] b = UTF16Encoder.encode(TransData.USER_ONLINE + users.get(i).toString(toClient));			  
			  this.sock.send(new DatagramPacket(b, b.length, clientAddress, clientPort));
			}
		}
		catch(Exception e){}
	}
		
	private void update(User u)
	{
		if ( isUserExist(u.value("ID")) ){
		   users.get(getUserNumberInList(u.value("ID"))).update(u);
		   activeUpdateEvent(u);
		   informAllUser(TransData.USER_UPDATE, u);
		}
	}
	
	//通知指定客户端其提交的ID是否合格(有重名)
	private void validateID(User u)
	{
		try{			
			byte[] b;
		  if (getUserNumberInList(u.value("ID")) == -1)
		     b = UTF16Encoder.encode(TransData.ID_OK + u.toString());
		  else
		     b = UTF16Encoder.encode(TransData.ID_NOT_OK + u.toString());
		  InetAddress addr = InetAddress.getByName(u.value("addr"));
		  int port = Integer.parseInt(u.value("port"));
		  this.sock.send(new DatagramPacket(b, b.length, addr, port));
		}
		catch(Exception e){}
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -