📄 clientlist.java
字号:
package org.tuna.net.csuim;
import java.net.*;
import java.util.*;
import org.tuna.net.encode.UTF16Encoder;
public class ClientList extends Thread
{
//private ArrayList users; //for jdk1.4
private ArrayList<User> users;
//private ArrayList userAdapters; //for jdk1.4
private ArrayList<UserListener> userListeners;
private int port;
private DatagramSocket sock;
private InetAddress serverAddress;
private int serverPort;
private boolean stop;
public ClientList(int op, InetAddress sa, int sp) throws Exception
{
//users = new ArrayList(); //for jdk1.4
users = new ArrayList<User>();
userListeners = new ArrayList<UserListener>();
serverAddress = sa;
serverPort = sp;
port = op;
sock = new DatagramSocket(port);
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();
execute(cmdstr.charAt(0), new User(cmdstr.substring(1)));
}
}
catch(Exception e){
e.printStackTrace();
}
}
// ----- Public Method -----
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();
}catch(Exception e){}
}
public int countUsers()
{
return users.size();
}
public User getUser(String id)
{
if ( !isUserExist(id) )
return null;
else
return users.get(getUserNumberInList(id));
}
private boolean isUserExist(String id)
{
if ( getUserNumberInList(id) == -1 )
return false;
else
return true;
}
public User[] toArray()
{
if (users.size() == 0)
return null;
else
return users.toArray(new User[users.size()]);
}
public void updateList()
{
try{
User temp = new User("ask_all", false);
temp.update("onPort", String.valueOf(this.port));
byte[] b = UTF16Encoder.encode(TransData.ASK_FOR_ALL + temp.toString());
this.sock.send(new DatagramPacket(b, b.length, this.serverAddress, this.serverPort));
}catch(Exception e){}
}
//------ 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.USER_ONLINE:
online(u);
break;
case TransData.USER_LEAVE:
leave(u);
break;
case TransData.USER_UPDATE:
update(u);
break;
//case
}
}
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 leave(User u)
{
if ( isUserExist(u.value("ID")) ){
users.get(getUserNumberInList(u.value("ID"))).update("online", "false");
activeLeaveEvent(u);
}
}
private void online(User u)
{
if ( isUserExist(u.value("ID")) ){
users.get(getUserNumberInList(u.value("ID"))).update(u);
activeOnlineEvent(u);
}
else{
this.users.add(u);
activeCreateNewEvent(u);
}
}
private void update(User u)
{
if ( isUserExist(u.value("ID")) ){
users.get(getUserNumberInList(u.value("ID"))).update(u);
activeUpdateEvent(u);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -