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

📄 sendmsg.java

📁 Java+Eclipse+Mysql的局域网聊天程序源代码
💻 JAVA
字号:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendMsg implements Runnable
{
	//private String msg="";		//待发送的消息
	//private int port;			//服务器端口
	//private InetAddress addr;	//服务器地址		
	private Thread t=null;		//发送线程
	
	private boolean goon=true;    //是否继续发送线程
	
	//private boolean timeout=false;	//是否超时
	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()
	{	
		for(int i=0;i<3;i++)
		{
			msgvector[i]=new MsgVector();
			msgvectorend[i]=new MsgVector();
		}
	}
	
	public void start()				//启动发送线程
	{
		t=new Thread(this);
		t.start();
		System.out.println("(Client)发送线程启动!");
	}
	public void stop()
	{
		goon=false;
		System.out.println("(Client)发送线程停止!");
	}
	public void setMsg(String msg,int port,String addr,boolean sendrightnow,boolean needquest)
	{
		MsgVector mv=new MsgVector(msg,port,addr,needquest);
		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("(Client)新增一条待发送消息!");
	}	
	public boolean needSend()
	{
		if(numofmsg[0]>0)
			return true;
		return false;
	}	
	public void run()
	{
		while(goon)
		{
			if(needSend())		//有要发送的消息则发送
			{
				send();
			}
			else   //没有要发送的数据包,sleep(100)
			{
				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("(Client)发送超时!");
			e.printStackTrace();
			socksend.close();
		}
		System.out.println("(Client)成功发送一条消息:"+msgvector[0].next.msg);
		setSended();			//发送成功
		socksend.close();
	}
	public void setOutTime()
	{
		if(numofmsg[2]<=0)          //如果超时队列为空
		{
			msgvector[2].next=msgvector[0].next;		//将超时的数据包增加到超时队列末尾
			msgvectorend[2]=msgvector[2].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 + -