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

📄 userclient.java

📁 本程序可在局域网内实现聊天、传送文件功能
💻 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 + -