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

📄 sendmsg.java

📁 Java+Eclipse+Mysql的局域网聊天程序源代码
💻 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 + -