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

📄 f0eaf66114d700191f48b4d0fe87e2ab

📁 使用TCP和UDP协议
💻
字号:
/*
 * 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;
    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);
            //System.out.println(receiveSocket.getInetAddress().getCanonicalHostName());
        } 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) 
        {
            //debug:
            System.out.println("tcpThread.sockets.containsKey" + user_name);
            
            try
            {
                ((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 void run()
    {
        while(true)
        {
	        try
	        {
	            receiveSocket.receive(packetReceived);
	            System.out.println(packetReceived.getLength());
	            serverGUI.appendDisplayArea("从 " + packetReceived.getSocketAddress() + " 接到一个DatagramPacket");
	        } catch(IOException ioe)
	        {
	            serverGUI.appendDisplayArea("接收一个DatagramPacket时出现输入输出异常");
	        }
	        
//	      	判断如果消息是退出消息的话,就将对应的Socket关闭,并从HashMap中删除
	        String messageStr = new String(byteReceived, 0, packetReceived.getLength());
            if (messageStr.indexOf("QUIT: ") != -1)
            {
                String user = messageStr.substring(messageStr.indexOf("QUIT: ") + 6);
                
                //debug:
                System.out.println("kick " + user);
                
                kickUser(user);
                serverGUI.tcpThread.messageToAll("DEL " + user);
            }
            serverGUI.tcpThread.messageToAll(messageStr);
        }
    }
}

⌨️ 快捷键说明

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