📄 e0f47f4184d700191234c517fa66b1a7
字号:
/*
* Created on 2005-5-31
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package server;
/**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
import java.net.*;
import java.io.*;
import java.util.*;
class JabberThread extends Thread{
private int port = 1235;
ServerGUI serverGUI = null;
TCPThread tcpThread = null;
DatagramSocket receiveSocket = null;
DatagramPacket packetReceived = null;
byte[] byteReceived = new byte[1024];
// int receivedSize;
InetAddress serverAddress;
//判断是否构造成功:
boolean udpSuccess = true;
//用以停止线程的信号量:
boolean runFlag = true;
JabberThread(ServerGUI serverGUI, TCPThread tcpThread ,int udpPort)
{
this.serverGUI = serverGUI;
this.tcpThread = tcpThread;
port = udpPort;
serverGUI.appendDisplayArea("正在建立UDP Socket...");
try
{
serverAddress = InetAddress.getByName(null);
} catch(UnknownHostException uhn)
{
serverGUI.appendDisplayArea("主机名错误");
udpSuccess = false;
}
try
{
receiveSocket = new DatagramSocket(serverGUI.udpPort);
} catch(SocketException se)
{
serverGUI.appendDisplayArea("无法打开DatagramSocket,无法接收消息,请确定端口可用,然后重新启动");
udpSuccess = false;
return ;
}
serverGUI.appendDisplayArea("UDPSocket已建立");
packetReceived = new DatagramPacket(byteReceived, 1024);
}
public void kickUser(String user_name)
{
Object value = tcpThread.sockets.get(user_name);
if (value != null)
{
try
{
serverGUI.appendDisplayArea(user_name + "用户退出,关闭连接" + ((Socket)value).getInetAddress());
((Socket)value).close();
} catch(IOException ioe)
{
serverGUI.appendDisplayArea("用户退出后关闭对应socket时出现异常");
}
//从map中删除
tcpThread.sockets.remove(user_name);
} else
{
serverGUI.appendDisplayArea("在删除用户时,出现用户名解析错误,找不到对应的键值");
}
}
//关闭以释放端口:
public void closeUdpSocket()
{
if (receiveSocket != null)
receiveSocket.close();
}
public synchronized void stopUDPThread()
{
runFlag = false;
}
public synchronized boolean getUDPRunFlag()
{
return runFlag;
}
public void run()
{
runFlag = true;
while(getUDPRunFlag())
{
try
{
receiveSocket.receive(packetReceived);
serverGUI.appendDisplayArea("从 " + packetReceived.getSocketAddress() + " 接到一个DatagramPacket");
} catch(IOException ioe)
{
serverGUI.appendDisplayArea("UDP接收Socket关闭");
}
String messageStr = new String(byteReceived, 0, packetReceived.getLength());
//判断如果消息是退出消息的话,就将对应的Socket关闭,并从HashMap中删除
if (messageStr.indexOf("QUIT ") != -1)
{
String user = messageStr.substring(messageStr.indexOf("QUIT: ") + 6);
kickUser(user);
serverGUI.tcpThread.messageToAll("DEL " + user);
continue;
}
//如果是私聊,就只发给destination
if (messageStr.indexOf("PRIVATE ") != -1)
{
String user = messageStr.substring((messageStr.indexOf("TO ") + 3), (messageStr.indexOf("MSG ") - 1));
tcpThread.messageToOne(user, messageStr);
continue;
}
serverGUI.tcpThread.messageToAll(messageStr);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -