📄 sendmsg.java
字号:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendMsg implements Runnable
{
private Thread t=null; //发送线程
private boolean stop=true; //停止标志
private boolean pause=true; //暂停标志
private QQServer qqs=null;
public MsgVector[] msgvector=new MsgVector[3];//消息队列
public MsgVector[] msgvectorend=new MsgVector[3];
public int []numofmsg=new int[3];
//msgvector[0]为待发送的消息 msgvector[1]为已发送消息 msgvector[2]为超时消息
public SendMsg(QQServer qqs)
{
for(int i=0;i<3;i++)
{
msgvector[i]=new MsgVector();
msgvectorend[i]=new MsgVector();
}
this.qqs=qqs;
}
public void start() //服务端开始
{
if(stop) //如果是被停止
{
stop=false;
pause=false;
t=new Thread(this); //创建新线程
t.start();
}
else if(pause) //如果是被暂停
{
pause=false;
}
System.out.println("(Server)发送线程已启动!");
}
public void pause() //服务端暂停
{
pause=true;
System.out.println("(Server)发送线程已暂停!");
}
public void stop() //服务端停止
{
stop=true;
System.out.println("(Server)发送线程已停止!");
}
public void setMsg(String msg,int port,String addr,boolean sendrightnow)
{
MsgVector mv=new MsgVector(msg,port,addr);
if(numofmsg[0]==0)
{
msgvector[0].next=mv;
msgvectorend[0]=mv;
}
else
{
if(sendrightnow) //根据紧急级别选择消息加在末尾还是首部
{
mv.next=msgvector[0].next;
msgvector[0].next=mv;
}
else
{
msgvectorend[0].next=mv; //末节点位置指向新添加的msgvector
msgvectorend[0]=mv;
}
}
numofmsg[0]++; //待发送消息+1
System.out.println("(Server)新增待发送消息!");
}
public boolean needSend()
{
if(numofmsg[0]>0)
return true;
return false;
}
public void run()
{
while(!stop)
{
if(!pause)
{
if(needSend()) //有要发送的消息则发送
{
send();
}
else //没有要发送的数据包,sleep(100)
{
try
{
t.sleep(100);
}
catch(InterruptedException ie)
{
ie.printStackTrace();
}
}
}
else
{
try
{
t.sleep(100);
}
catch(InterruptedException ie)
{
ie.printStackTrace();
}
}
}
}
public void send()
{
DatagramSocket socksend=null;
try
{
String []tempmsg=msgvector[0].next.msg.split("\\|");
if(tempmsg[0].length()<5) //如果没有时间标志
msgvector[0].next.msg=Function.getTimeTag()+"|"+msgvector[0].next.msg;
msgvector[0].next.time=Function.getTime(); //设置当前时间的末尾5位
msgvector[0].next.sendedtimes++; //已发送次数+1
byte[]message=msgvector[0].next.msg.getBytes();
InetAddress addr=InetAddress.getByName(msgvector[0].next.addr);
int port=msgvector[0].next.port;
DatagramPacket packetsend=new DatagramPacket(message,message.length,addr,port);
socksend=new DatagramSocket();
socksend.setSoTimeout(3000);
socksend.send(packetsend);
}
catch(Exception e) //发送出现异常(按超时处理)
{
setOutTime(); //数据包发送超时
System.out.println("(Server)发送超时!");
e.printStackTrace();
socksend.close();
}
System.out.println("(Server)成功发送一消息:"+msgvector[0].next.msg);
setSended(); //发送成功
socksend.close();
}
public void setOutTime()
{
if(numofmsg[2]<=0) //如果超时队列为空
{
msgvector[2].next=msgvector[0].next; //将超时的数据包增加到超时队列末尾
msgvectorend[2]=msgvector[0].next; //超时队列尾指针后移
msgvector[0].next=msgvector[0].next.next; //将超时的数据包从待发送队列中删除
}
else
{
msgvectorend[2].next=msgvector[0].next; //
msgvector[0].next=msgvector[0].next.next;
}
numofmsg[2]++;
numofmsg[0]--;
}
public void setSended()
{
if(numofmsg[1]<=0)
{
msgvector[1].next=msgvector[0].next;
msgvectorend[1]=msgvector[0].next;
msgvector[0].next=msgvector[0].next.next;
}
else
{
msgvectorend[1].next=msgvector[0].next; //
msgvector[0].next=msgvector[0].next.next;
}
numofmsg[1]++;
numofmsg[0]--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -