📄 service.java
字号:
package qianqian.cschat;
import java.util.HashMap;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import qianqian.gui.Server;
import qianqian.p2pchat.constant.Const;
public class Service {
private HashMap<String, String> users = new HashMap<String, String>();
private static Service service;
private Thread recvThread;
private DatagramSocket dgmSocket;
private class RecvThread extends Thread {
private DatagramSocket udpSocket = null;
public RecvThread(DatagramSocket iSock) {
udpSocket = iSock;
}
public void run() {
byte inBuf[] = new byte[Const.RecvBufSize];
DatagramPacket recvPack = new DatagramPacket(inBuf,
Const.RecvBufSize);
try {
while (!isInterrupted()) {
udpSocket.receive(recvPack);
dataReceived(recvPack.getData(), recvPack.getLength(),
recvPack.getAddress());
}
} catch (Exception ex) {
}
}
}
private Service() {
try {
dgmSocket = new DatagramSocket(Const.SerPort);
} catch (Exception e) {
e.printStackTrace();
}
if (recvThread != null)
recvThread.interrupt();
recvThread = new RecvThread(dgmSocket);
recvThread.start();
}
public static Service getInstance() {
if (service == null) {
synchronized (Service.class) {
if (service == null)
service = new Service();
}
}
return service;
}
protected void dataReceived(byte[] iBuf, int iLen, InetAddress iAddr)
throws Exception {
Object msgIn = getMessage(iBuf, iLen);
Message recMsg = (Message) msgIn;
parseMessage(recMsg, iAddr);
}
protected void dispatch(byte iBuf[], int iSize, String iAddr)
throws Exception {
DatagramPacket disptchPack = new DatagramPacket(iBuf, iSize,
InetAddress.getByName(iAddr), Const.CliPort);
dgmSocket.send(disptchPack);
}
private Object getMessage(byte[] iBuf, int iLen) throws Exception {
java.io.ByteArrayInputStream bIn = new java.io.ByteArrayInputStream(
iBuf, 0, iLen);
java.io.ObjectInputStream oiStream = new java.io.ObjectInputStream(bIn);
Object msgIn = oiStream.readObject();
oiStream.close();
return msgIn;
}
private void sendMsg(Object iMsg, String iAddr) throws Exception {
java.io.ByteArrayOutputStream bOut = new java.io.ByteArrayOutputStream();
java.io.ObjectOutputStream ooStream = new java.io.ObjectOutputStream(
bOut);
ooStream.writeObject(iMsg);
ooStream.close();
byte[] bytes = bOut.toByteArray();
dispatch(bytes, bytes.length, iAddr);
}
private synchronized void parseMessage(Message recMsg, InetAddress iAddr)
throws Exception {
char code = recMsg.getCode();
switch (code) {
case Const.CODE_USER_MSG:
if (users.containsKey(recMsg.getTo())) {
sendMsg(recMsg, users.get(recMsg.getTo()));
} else {
MessageManager.addMessage(recMsg.getTo(), recMsg.getFrom(),
recMsg.getContent());
Message msg = new Message(Const.CODE_SYSTEM_MSG,
recMsg.getTo(), recMsg.getFrom(),
"您的好友不在线,您所发消息自动保存到好友留言箱!");
sendMsg(msg, iAddr.getHostName());
}
return;
case Const.CODE_BOOK_MSG:
String content = MessageManager.getMessage(recMsg.getFrom(), recMsg
.getTo());
if (content.isEmpty())
content = "沒有任何留言!\n";
Message msg = new Message(Const.CODE_BOOK_MSG, recMsg.getTo(),
recMsg.getFrom(), content);
sendMsg(msg, iAddr.getHostName());
Server.getInstance().setLog("TCP:", iAddr.getHostAddress(), "Book");
return;
case Const.CODE_OFFLINE_MSG:
users.remove(recMsg.getFrom());
Server.getInstance().setLog("TCP:", iAddr.getHostAddress(),
"Logout");
return;
case Const.CODE_ONLINE_MSG:
users.put(recMsg.getFrom(), iAddr.getHostAddress());
Server.getInstance()
.setLog("TCP:", iAddr.getHostAddress(), "Login");
return;
}
}
public void quit() {
if (dgmSocket != null) {
dgmSocket.close();
dgmSocket = null;
}
users.clear();
recvThread.interrupt();
service = null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -