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