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

📄 udpserver.java

📁 ICQ聊天程序
💻 JAVA
字号:
//UDPServer.java
import java.io.*;
import java.net.*;
import java.util.*;

public class UDPServer extends Thread{
    
    DatagramSocket datagramSocket;  //DatagramSocket对象
    DatagramPacket inDataPacket;  //接收数据包
    DatagramPacket outDataPacket;  //发送数据包
    InetAddress clientAddress;  //对方IP地址
    InetAddress senterAddress,receiverAddress;//发送者、接收者IP地址
    int clientPort;   //对方端口号
    byte[] msg= new byte[100]; //接收数据包的缓冲池
    byte[] time; //要发送的信息
    ServerThread serverThread;
    String receivedMsg;  //接收到的信息
    String receiveStr="";
    String clientMsg,senterIP,receiverIP;//clientMsg:message,ip:message中的ip字段
    
    
    
//    public byte[] getTime() {
//        Date d = new Date();
//        return new String("Server>>>This is the system time: " + d.toString()).getBytes();
//    }

    public void run(){
    	try{
    		datagramSocket = new DatagramSocket(8003);//打开8001端口
    	}catch (Exception e){System.out.println (e);}
    	System.out.println("\nUDP server active on port 8003");/////////
        while (true) {		//循环读信息
        
        
//        synchronized(sThread.messages)                   //同步处理
//         {
//            if(sThread.messages.isEmpty())                //如果无讯息
//               continue;                                  //则继续等待
//           
//            m = (String)sThread.messages.firstElement();  //取出第一个讯息
//            sThread.messages.removeElement(m);            //移除第一个讯息
		     inDataPacket 	= new DatagramPacket(msg, msg.length);
             
             try{
    		datagramSocket.receive (inDataPacket);//接收客户端信息
    	}catch (Exception e){System.out.println (e);}
             receivedMsg 	= new String (inDataPacket.getData(), 0,inDataPacket.getLength());//信息类型转换,转换成String
             System.out.println(receivedMsg);///////show receive mesg
             
             receiveStr		=receivedMsg;
             clientAddress  = inDataPacket.getAddress();//发送者ip
             clientPort 	= inDataPacket.getPort();//发送者端口
             receiveStr		=receivedMsg+clientAddress;//信息中含三个字段,1:收者IP,2:信息,3:发者IP 
             serverThread.ptpmessage.addElement(receiveStr);//添加到Vector ptpmessage

             System.out.println (clientAddress);////////用于验证输出
             System.out.println (clientPort);////////	
//         }

         synchronized(serverThread.ptpmessage)                    //同步处理
         {
            
            for(int i=0;i<serverThread.ptpmessage.size();i++)//显示ptpmessage中的所有信息
            {
               String c = (String)serverThread.Clients.elementAt(i);
               System.out.println (c);
            }
			for(int i=0;i<serverThread.ptpmessage.size();i++)//对每条信息(三字段)
            {
               clientMsg = (String)serverThread.ptpmessage.elementAt(i);
               receiverIP=getReceiverIP(clientMsg);				//获取接收者IP
               senterIP =getSenterIP(clientMsg);				//获取发送者IP
           	   
               try{
    				receiverAddress=InetAddress.getByName(receiverIP);//获取接收者IP(InetAddress类型)
           	    	senterAddress=InetAddress.getByName(senterIP);	//获取发送者IP(InetAddress类型)
    			}catch (Exception e){System.out.println (e);}
			  for(int j=0;j<serverThread.Clients.size();j++)//Vector Clients记录在线人数
            	{
            
              		if(receiverIP==serverThread.Clients.elementAt(i) ) {//在线	
              		outDataPacket = new DatagramPacket(getMsg(clientMsg), getMsg(clientMsg).length,receiverAddress, clientPort);
             			
             	 try{
    					datagramSocket.send(outDataPacket);//发送信息给对应的在线人员
    				}catch (Exception e){System.out.println (e);}
    				
             		
             		}//if(在线)
             		else {//不在线
             			byte[] errStr=new String("对方不在线").getBytes();//byte[] 类型信息,提示不在线			
             			outDataPacket = new DatagramPacket(errStr, errStr.length,senterAddress, clientPort);
             			
             			try{
    							datagramSocket.send(outDataPacket);//发送信息给对应的在线人员
    						}catch (Exception e){System.out.println (e);}
             		}//else
             		serverThread.ptpmessage.removeElement(clientMsg);//删除信息
            	}//for
        	}//for

         }
//          String ip=getIP(receivedMsg);
//			sentAddress=InetAddress.getByName(getIp(receivedMsg));	//获取对方的ip地址
          }//while
       }//run
      
     
         public String getReceiveMsg() { //获取接收信息
        	if(receiveStr!="")return receiveStr;
        	else return null;
   		 	}   

		public String getReceiverIP(String string) { //获取信息中的接收者IP字段
		
        	return string.substring(0,string.indexOf("@",0) )  ;
   		 	} 
   		public String getSenterIP(String string) { //获取信息中的发送者IP字段
		
        	return string.substring(string.lastIndexOf("@"),string.length()  )  ;
   		 	}  	  
   		public byte[] getMsg(String string) { //获取信息中的信息字段
        	return new String (string.substring(string.indexOf("@",0),string.length() ) ).getBytes() ;
   		 	} 	
   		 	
   		public static void main (String args[]) {//测试函数
        UDPServer udpServer = new UDPServer();
        udpServer.run();
//        try {
//            udpServer.run();
//        } catch (IOException e) {
//             System.out.println ("IOException occurred with socket.");
//             System.out.println (e);
//             System.exit(1);
//         }
     }
   		 	  	
     	
}

⌨️ 快捷键说明

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