黑马程序员-- udp(心跳包) 编写网络管理类 笔记

------- android培训java培训、期待与您交流! ----------


总结,这是我写的udp管理类。,当时用在小例子上,便于复用性,写成管理类。

包含心跳包的发送

客户端myudpclient


package test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketAddress;
import java.util.Collection;
import java.util.HashMap;

import Infos.MsgInfo;
import Infos.Ok_ByteItem;
import Listener.ClientOnLineListener;
import Listener.GetDataListener;
import Listener.OkItemListener;
import Listener.ReturnDataListener;
import Listener.ServerOnLineListener;

public class myudpclient implements Runnable, OkItemListener,
		ReturnDataListener {
	// udp连接。客户端的udp连接
	//
	final int databuffer = 1440;
	getall allget;//主接收管理类
	sendall sendtoserver;//主发送管理类
	HashMap<Integer, subclient> clientlist = new HashMap<Integer, subclient>();//客户管理类

	DatagramSocket client;
	SocketAddress ServerAdd;
	int UIN = 0;
	int servercount = 0;
//实例的时候传入地址端,和端口
	public myudpclient(SocketAddress seradd, int port) throws IOException {
		ServerAdd = seradd;

		client = new DatagramSocket(port);
		sendtoserver = new sendall(client);
		allget = new getall();
		allget.okev = this;
		//接收包的线程
		new Thread(this).start();
		//发送心跳包的循环线程
//		整理心跳包数据
//		发送心跳包
//		发送计数
//		三秒没收到,通知离线
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					try {
						byte[] stabyte = new byte[5];
						stabyte[0] = publicv.beep;
						byte[] u = Convert_Type.int2Byte(UIN);
						System.arraycopy(u, 0, stabyte, 1, 4);
						DatagramPacket pack = new DatagramPacket(stabyte, 1,
								ServerAdd);
						client.send(pack);
						servercount += 1;
						if (servercount > 3) {
							if (serverstatus != null)
								serverstatus.ServerOnline(false, ServerAdd);
						}
						Thread.sleep(1000);
					} catch (Exception e) {
					}
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					Collection<subclient> list = clientlist.values();
					for (subclient c : list) {
						c.sendbeep();
						c.sendcount += 1;
						if (c.sendcount > 3) {
							if (clientstatus != null)
								clientstatus.Online(c.Uin, false);
						}
					}
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
					}
				}
			}
		}).start();
	}

	@Override
	public void run() {
		while (true) {
			try {
				DatagramPacket pack = new DatagramPacket(new byte[databuffer],
						databuffer);
				client.receive(pack);
				byte[] data = new byte[pack.getLength()];
				System.arraycopy(pack.getData(), 0, data, 0, data.length);
				getbyte(data, pack.getSocketAddress());
			} catch (Exception e) {
			}
		}

	}

	private void getbyte(byte[] data, SocketAddress add) {
		switch (data[0]) {
		case publicv.beep://更改状态,更改计数器
			servercount = 0;
			if (serverstatus != null)
				serverstatus.ServerOnline(true, add);
			break;
		case publicv.clientbeep:
			if (data.length == 1) {
				byte[] beepdata = new byte[5];
				beepdata[0] = publicv.clientbeep;
				byte[] tmp = Convert_Type.int2Byte(UIN);
				System.arraycopy(tmp, 0, beepdata, 1, 4);
				try {
					client.send(new DatagramPacket(beepdata, 5, add));
				} catch (Exception e) {
				}
			} else {
				int tmpuin = Convert_Type.byte2Int(data, 1);
				clientlist.get(tmpuin).sendcount = 0;
				if (clientstatus != null)
					clientstatus.Online(tmpuin, true);
			}
			break;
		case publicv.sendok:
			int u = Convert_Type.byte2Int(data, 13);
			if (u == 0) {
				sendtoserver.sendok(data);
			} else {
				if (clientlist.containsKey(u)) {
					clientlist.get(u).sendok(data);
				}
			}
			break;
		case publicv.data:
			allget.getdata(data, add);
			break;
		}
	}

	public void sendtoserver(MsgInfo info) {
		sendtoserver.Send(info.GetBytes(), ServerAdd, publicv.Send_bytedata);
	}

	public void sendtoclient(int uin, MsgInfo info) {
		if (clientlist.containsKey(uin)) {
			clientlist.get(uin).send(info.GetBytes(), publicv.Send_bytedata);
		}
	}

	ServerOnLineListener serverstatus;
	ClientOnLineListener clientstatus;
	GetDataListener netdata;

	@Override
	public void ReData(Ok_ByteItem item) {
		MsgInfo info = new MsgInfo(item.data, item.data.length);
		System.out.println("aaaa" + item.data.length);
		if (netdata != null)
			netdata.Get_Data(info, item.point);
	}

	@Override
	public void ReturnData(byte[] data, int destuin, SocketAddress clientPoint) {
		try {
			client.send(new DatagramPacket(data, data.length, clientPoint));
		} catch (Exception e) {
		}

	}
	//加对方客户的方法
	public void addclient(int dsetuin,SocketAddress add){
		subclient sub= new subclient(dsetuin, add, client);
		clientlist.put(dsetuin, sub);
	}
}



服务器myudpserver


package test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketAddress;

import Infos.MsgInfo;
import Infos.Ok_ByteItem;
import Listener.ClientOnLineListener;
import Listener.GetDataListener;
import Listener.OkItemListener;
import Listener.ReturnDataListener;

public class myudpserver implements Runnable, OkItemListener,
		ReturnDataListener {
	// udp连接。服务器的udp连接
	//
	final int databuffer = 1440;
	getall allget;
	sendall sendtoserver;
	DatagramSocket client;
	int UIN = 0;
	int servercount = 0;

	public myudpserver(int port) throws IOException {

		client = new DatagramSocket(port);
		sendtoserver = new sendall(client);
		allget = new getall();
		allget.okev = this;
		allget.returnev = this;
		// 接受包的循环线程
		new Thread(this).start();
	}

	@Override
	public void run() {
		while (true) {
			try {
				DatagramPacket pack = new DatagramPacket(new byte[databuffer],
						databuffer);
				client.receive(pack);
				byte[] data = new byte[pack.getLength()];
				System.arraycopy(pack.getData(), 0, data, 0, data.length);
				getbyte(data, pack.getSocketAddress());
			} catch (Exception e) {
			}
		}

	}

	// 接收的包进行处理的方法(传入接受到的数据和和接收包的地址)
	private void getbyte(byte[] data, SocketAddress add) {
		switch (data[0]) {
		case publicv.beep:

			if (online != null)
				online.Online(Convert_Type.byte2Int(data, 1), true);
			System.out.println(1001);
			try {
				client.send(new DatagramPacket(new byte[] { publicv.beep }, 1,
						add));
			} catch (Exception e) {
			}
			break;
		case publicv.sendok:
			sendtoserver.sendok(data);
			break;
		case publicv.data:
			allget.getdata(data, add);
			break;
		}
	}
//发送方法,发送给客户端to client;
	public void sendtoclient(MsgInfo info, SocketAddress add) {
		sendtoserver.Send(info.GetBytes(), add, publicv.data);
	}
//俩个接口
	ClientOnLineListener clientstatus;
	GetDataListener netdata;
//实现接口
	@Override
	public void ReData(Ok_ByteItem item) {
		MsgInfo info = new MsgInfo(item.data, item.data.length);
		if (netdata != null)
			netdata.Get_Data(info, item.point);
	}

	@Override
	public void ReturnData(byte[] data, int destuin, SocketAddress clientPoint) {
		try {
			client.send(new DatagramPacket(data, data.length, clientPoint));
		} catch (Exception e) {
		}

	}

	ClientOnLineListener online;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值