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