📄 userclient.java
字号:
package org.tuna.net.csuim;
import java.io.*;
import java.net.*;
import java.util.*;
import org.tuna.net.encode.UTF16Encoder;
public abstract class UserClient
{
private User myself;
private DatagramSocket sock;
private InetAddress serverAddress;
private int serverPort;
public UserClient(InetAddress sa, int sp) throws Exception
{
sock = new DatagramSocket();
serverAddress = sa;
serverPort = sp;
myself = new User("Tuna", false);
load();
getOnline();
}
// -- Public Methods --
//用于获取动态变换的信息, 如一些端口号
public abstract void getExtend(User u);
public void close() throws Exception
{
leave();
save();
sock.close();
}
public User getMyself()
{
return myself;
}
public abstract void getUserInfo(ArrayList<String> n, ArrayList<String> v);
public abstract void idExisted();
public void update(User u)
{
myself.update(u);
save();
try{
byte[] b = UTF16Encoder.encode(TransData.USER_UPDATE + myself.toString());
this.sock.send(new DatagramPacket(b, b.length, this.serverAddress, this.serverPort));
}catch(Exception e){}
}
// -- Private Methods --
private void fillMyself(ArrayList<String> n, ArrayList<String> v)
{
for(int i = 0; i < n.size(); i++){
if ( this.myself.value(n.get(i)) == null )
this.myself.add(n.get(i), v.get(i));
else
this.myself.update(n.get(i), v.get(i));
}
}
private void getOnline()
{
try{
byte[] b = UTF16Encoder.encode(TransData.USER_ONLINE + myself.toString());
this.sock.send(new DatagramPacket(b, b.length, this.serverAddress, this.serverPort));
}catch(Exception e){}
}
private void leave()
{
try{
byte[] b = UTF16Encoder.encode(TransData.USER_LEAVE + myself.toString(new String[]{"ID"}));
this.sock.send(new DatagramPacket(b, b.length, this.serverAddress, this.serverPort));
}catch(Exception e){}
save();
}
//从指定文件载入用户信息,这是在客户端构造UserInfoManager对象的唯一方法
private void load() throws Exception
{
File f = new File("usr.inf");
if (f.exists()){
Properties usrset = new Properties();
FileInputStream in = new FileInputStream(f);
usrset.load(in);
Enumeration e = usrset.propertyNames();
while(e.hasMoreElements()){
String n = (String)e.nextElement();
if ( this.myself.value(n) == null )
this.myself.add(n, usrset.getProperty(n));
else
this.myself.update(n, usrset.getProperty(n));
}
}
else{
do{
ArrayList<String> names = new ArrayList<String>();
ArrayList<String> value = new ArrayList<String>();
getUserInfo(names, value);
fillMyself(names, value);
if ( !validate() )
idExisted(); //抽象方法
else
break;
}
while( true );
}
getExtend(myself); //从应用者处取得扩展信息
save();
}
private void save()
{
try{
Properties usrset = new Properties();
FileOutputStream out = new FileOutputStream("usr.inf");
String[] names = myself.getAllNames();
if ( names == null ) return;
else
for(String n : names){
usrset.put(n, this.myself.value(n));
}
usrset.store(out, "user information");
out.close();
}
catch(Exception e){
e.printStackTrace();
}
}
//将ID提交至服务端,验证是否可用(有重名)
private boolean validate()
{
try{
DatagramSocket sock = new DatagramSocket();
User tempUser = new User(this.myself.value("ID"), false);
tempUser.add("port", String.valueOf(sock.getLocalPort()));
byte[] b = UTF16Encoder.encode(TransData.APPLY_ID + tempUser.toString());
sock.send(new DatagramPacket(b, b.length, this.serverAddress, this.serverPort));
byte[] rcvByte = new byte[8];
sock.receive(new DatagramPacket(rcvByte, rcvByte.length));
String rcvstr = UTF16Encoder.decode(rcvByte);
sock.close();
if ( rcvstr.charAt(0) == TransData.ID_OK )
return true;
else
return false;
}
catch(Exception e){
e.printStackTrace();
return false;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -