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

📄 udpmsgrecv.java

📁 JAVA IP Messenge0.1版说明 作者:吴拓 E-mail:setsail_wu@163.com 完成时间:2008年8月18日 开发环境:j2sdk-1_4_2_18-windo
💻 JAVA
字号:
/*作者:吴拓 Email:setsail_wu@163.com
 */

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.Hashtable;
import java.util.Calendar;

public class UdpMsgRecv extends Thread{	

	/*========== Constant Value ==========*/
	public static final long IPMSG_COMMASK		= 0x000000ffL;
	public static final long IPMSG_OPTMASK		= 0xffffff00L;
	
	public static final long IPMSG_NOOPERATION	= 0x00000000L;
	
	public static final long IPMSG_BR_ENTRY		= 0x00000001L;
	public static final long IPMSG_BR_EXIT		= 0x00000002L;
	public static final long IPMSG_ANSENTRY		= 0x00000003L;
	public static final long IPMSG_BR_ABSENCE	= 0x00000004L;
	
	public static final long IPMSG_BR_ISGETLIST = 0x00000018L;
	public static final long IPMSG_OKGETLIST	= 0x00000015L;
	public static final long IPMSG_GETLIST		= 0x00000016L;
	public static final long IPMSG_ANSLIST		= 0x00000017L;
	
	public static final long IPMSG_SENDMSG		= 0x00000020L;
	public static final long IPMSG_RECVMSG		= 0x00000021L;
	
	public static final long IPMSG_READMSG		= 0x00000030L;
	public static final long IPMSG_DELMSG		= 0x00000031L;
	
	public static final long IPMSG_GETINFO		= 0x00000040L;
	public static final long IPMSG_SENDINFO		= 0x00000041L;
	
	public static final long IPMSG_GETPUBKEY	= 0x00000072L;
	public static final long IPMSG_ANSPUBKEY	= 0x00000073L;
	
	// other opt
	public static final long IPMSG_ABSENCEOPT		= 0x00000100L;
	public static final long IPMSG_SERVEROPT		= 0x00000200L;
	public static final long IPMSG_DIALUPOPT		= 0x00010000L;
	public static final long IPMSG_ENCRYPTOPT		= 0x00400000L;
	public static final long IPMSG_ENCRYPTOPTOLD	= 0x00800000L;
	
	// send opt
	public static final long IPMSG_SENDCHECKOPT = 0x00000100L;
	public static final long IPMSG_SECRETOPT	= 0x00000200L;
	public static final long IPMSG_BROADCASTOPT = 0x00000400L;
	public static final long IPMSG_MULTICASTOPT = 0x00000800L;
	public static final long IPMSG_NOPOPUPOPT	= 0x00001000L;
	public static final long IPMSG_AUTORETOPT	= 0x00002000L;
	public static final long IPMSG_RETRYOPT		= 0x00004000L;
	public static final long IPMSG_PASSWORDOPT	= 0x00008000L;
	public static final long IPMSG_NOLOGOPT		= 0x00020000L;
	public static final long IPMSG_NEWMUTIOPT	= 0x00040000L;

	// encrypt opt
	public static final long IPMSG_RSA_512		= 0x00000001L;
	public static final long IPMSG_RSA_1024		= 0x00000002L;
	public static final long IPMSG_RSA_2048		= 0x00000004L;
	public static final long IPMSG_RC2_40		= 0x00001000L;
	public static final long IPMSG_RC2_128		= 0x00004000L;
	public static final long IPMSG_RC2_256		= 0x00008000L;
	public static final long IPMSG_BLOWFISH_128 = 0x00020000L;
	public static final long IPMSG_BLOWFISH_256 = 0x00040000L;
	
	public static final int	 MAXBUF				= 1024;
	/*========== end ==========*/
	Calendar rightNow = Calendar.getInstance();
	
	private byte[] packByte;
	private long version = 1, no =  rightNow.getTimeInMillis(), command;//no由当前时间产生
	private String user = null, host = null, extra = null;
	InetAddress localaddr;
	
	
	private DatagramSocket UdpMsgds = null;
	private byte[] buffer = new byte[MAXBUF];
	private DatagramPacket packet = null;
	private DatagramPacket packetsend = null;
	private final int port = 2425;
	private MessengePack msgpack;
	private MessengePack msgpacksend;
	public Hashtable hashtable = new Hashtable();
	
	//用于广播的变量
	InetAddress group = null;
	MulticastSocket socket = null;
	
	public UdpMsgRecv(DatagramSocket tmpds){
		UdpMsgds = tmpds;
		try{
			UdpMsgds.setReceiveBufferSize(819200);				
		}catch(Exception e){
			System.out.println("UdpMsgRecv.java:UdpMsgRecv():error1:" + e);
		}
		try{
			localaddr = InetAddress.getLocalHost();//获得本机IP
			user = (String)localaddr.getHostName();//获得本机名称 
			host = (String)localaddr.getHostName();//获得本机名称 
		}catch(Exception e){
			System.out.println("UdpMsgRecv.java:UdpMsgRecv():error:" + e);
		}
	}
	
	public Hashtable gethashtable(){
		return hashtable;
	}
	
	public void run(){
		this.broadcast(IPMSG_BR_ENTRY);//上线广播
		packet = new DatagramPacket(buffer, buffer.length);
		while(true){
			try{
				this.receive();
			}catch(Exception e){
				System.out.println("UdpMsgRecv.java:this.receive():error:" + e);
			}
		}
		
	}

	public final void receive() throws IOException{
		System.out.println("接收信息...\n" + UdpMsgds.getReceiveBufferSize());
		UdpMsgds.receive(packet);
		String info = new String(packet.getData(), 0, packet.getLength());
		System.out.println("接收信息:" + info);
		msgpack = new MessengePack(packet.getData(), packet.getAddress());
		this.MsgEvenControl();
	}
	
	public void mysend(long commandtemp){
		msgpacksend = new MessengePack(version, no, user, host, commandtemp, extra, localaddr);
		packetsend = new DatagramPacket(msgpacksend.getBytes(), 
				msgpacksend.getBytes().length, msgpack.gethostip(), port);
		try{
			UdpMsgds.send(packetsend);				
		}catch(Exception e){
			System.out.println("UdpMsgRecv.java:MsgEvenControl():send error" + e);
		}		
		no = no + 1;
		System.out.println("no = " + no + "\n");
	}
	
	public void mysend(long commandtemp, String extratemp,InetAddress hostip){
		msgpacksend = new MessengePack(version, no, user, host, commandtemp, extratemp, localaddr);
		packetsend = new DatagramPacket(msgpacksend.getBytes(), 
				msgpacksend.getBytes().length, hostip, port);
		try{
			UdpMsgds.send(packetsend);				
		}catch(Exception e){
			System.out.println("UdpMsgRecv.java:MsgEvenControl():send error" + e);
		}		
		no = no + 1;
		System.out.println("no = " + no + "\n");		
	}
	
	public void broadcast(long commandtemp){
		try{
			group = InetAddress.getByName("255.255.255.255");//设置广播组的地址为192.168.1.0
			socket = new MulticastSocket(port);//多点广播套接字将在port端口广播
			socket.setTimeToLive(1);//多点广播套接字发送数据报范围为本地网络
			//socket.joinGroup(group);//加入广播组,加入group后,socket发送的数据报,
			                         //可以被加入到group中的成员接收到
			msgpacksend = new MessengePack(version, no, user, host, commandtemp, extra, localaddr);
			packetsend = new DatagramPacket(msgpacksend.getBytes(), 
					msgpacksend.getBytes().length, group, port);
			socket.send(packetsend);//广播数据包	
			no = no + 1;
		}catch(Exception e){
			System.out.println("UdpMsgRecv.java:broadcast():Error: " + e);
		}
	}

	public void MsgEvenControl(){

		switch ((int) (msgpack.getCommand() & IPMSG_COMMASK)) {
		case (int) IPMSG_BR_ENTRY:
			System.out.println(msgpack.getUser() + " is online.");
			hashtable.put(msgpack.gethostip(),msgpack);
			this.mysend(IPMSG_ANSENTRY);			
			/*
			String nickname = pref.getProperty("nickName");
			IPMSend.send(dsock, makePack(IPMSG_ANSENTRY | getEntryOpt()
				, nickname, true), ipme.getIPMAddress());*/
			break;
		case (int) IPMSG_ANSENTRY:
			System.out.println(msgpack.getUser() + "is online.");
			hashtable.put(msgpack.gethostip(),msgpack);
			break;
			/*if (publickey != null)
				IPMSend.send(dsock, makePack(IPMSG_GETPUBKEY
					, Long.toString(getCryptoCaps(), 16).toUpperCase(), false)
					, ipme.getIPMAddress());*/
		case (int) IPMSG_BR_ABSENCE:/*
			userlist.put(makeKey(ipme), ipme);
			if ((opt & IPMSG_DIALUPOPT) != 0
				&& dialupmember.get(ipme.getIPMAddress().toString()) == null)
				dialupmember.put(ipme.getIPMAddress().toString()
					, ipme.getIPMAddress());
			IPMEvent ie = new IPMEvent(this, IPMEvent.UPDATELIST_EVENT
				, new Date(System.currentTimeMillis()), ipme);
			invokeListener(ie);
			break;*/
		case (int) IPMSG_BR_EXIT:
			hashtable.remove(msgpack.gethostip());
			System.out.println(msgpack.getUser() + "is leave.");
			break;
			/*userlist.remove(makeKey(ipme));
			dialupmember.remove(ipme.getIPMAddress().toString());
			publickeys.remove(ipme.getIPMAddress().toString());
			ie = new IPMEvent(this, IPMEvent.UPDATELIST_EVENT
				, new Date(System.currentTimeMillis()), ipme);
			invokeListener(ie);
			break;*/
		case (int) IPMSG_SENDMSG:
			System.out.println("收到信息为" + msgpack.getExtra());
			RecvMsgWindow RecvMsgWin = new RecvMsgWindow(msgpack);
			RecvMsgWin.setVisible(true);
			this.mysend(IPMSG_RECVMSG);		
			/*
			if ((opt & IPMSG_SENDCHECKOPT) != 0)
				IPMSend.send(dsock
					, makePack(IPMSG_RECVMSG | IPMSG_AUTORETOPT
					, new Long(tmppack.getNo()).toString(), false)
					, ipme.getIPMAddress());
			if (new Boolean(pref.getProperty("absenceState")).booleanValue()
				&& (opt & IPMSG_AUTORETOPT) == 0)
				try {
					String tmpmsg = pref.getProperty("absenceMsg");
					if (!tmpmsg.equals(""))
						IPMSend.send(dsock
							, makePack(IPMSG_SENDMSG | IPMSG_AUTORETOPT
							, tmpmsg, false), ipme.getIPMAddress());
				} catch (MissingResourceException ex) {}
			if (!userlist.containsKey(makeKey(ipme))) {
				nickname = pref.getProperty("nickName");
				IPMSend.send(dsock
					, makePack(IPMSG_BR_ENTRY | IPMSG_AUTORETOPT
					| getEntryOpt(), nickname, true)
					, ipme.getIPMAddress());
			}
			if ((opt & IPMSG_ENCRYPTOPT) != 0)
				tmppack.setExtra(decryptMessage(tmppack.getExtra()));
			ie = new IPMEvent(this, IPMEvent.RECEIVEMSG_EVENT
				, new Date(System.currentTimeMillis()), ipme);
			invokeListener(ie);
			break;*/
		case (int) IPMSG_RECVMSG:/*
			try {
				Long tmpLong = new Long(tmppack.getExtra());
				NormalSend ns = (NormalSend) recentsend.get(tmpLong);
				if (ns != null) {
					ns.receiveReply();
					recentsend.remove(tmpLong);
				}
			} catch (NumberFormatException ex) {}
			break;*/
		case (int) IPMSG_READMSG:/*
			ie = new IPMEvent(this, IPMEvent.READMSG_EVENT
				, new Date(System.currentTimeMillis()), ipme);
			invokeListener(ie);
			break;*/
		case (int) IPMSG_DELMSG:/*
			ie = new IPMEvent(this, IPMEvent.DELETEMSG_EVENT
				, new Date(System.currentTimeMillis()), ipme);
			invokeListener(ie);
			break;*/
		case (int) IPMSG_GETPUBKEY:/*
			IPMSend.send(dsock, makePack(IPMSG_ANSPUBKEY
				, answerPublicKey(ipme.getPack()), false)
				, ipme.getIPMAddress());
			break;*/
		case (int) IPMSG_ANSPUBKEY:/*
			receivePublicKey(ipme);
			break;*/
		case (int) IPMSG_GETINFO:/*
			IPMSend.send(dsock, makePack(IPMSG_SENDINFO
				, pref.getProperty("version") + " ("
				+ System.getProperty("java.vendor") + " ver."
				+ System.getProperty("java.version") + "/"
				+ System.getProperty("os.name") + " "
				+ System.getProperty("os.version") + ")", false)
				, ipme.getIPMAddress());
			break;*/
		}
	}

}

⌨️ 快捷键说明

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