📄 serverlist.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 + -