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

来源:互联网 发布:js 获取get参数 编辑:程序博客网 时间:2024/05/29 08:11

------- 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() {@Overridepublic 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() {@Overridepublic 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();}@Overridepublic 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;@Overridepublic 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);}@Overridepublic 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();}@Overridepublic 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;//实现接口@Overridepublic void ReData(Ok_ByteItem item) {MsgInfo info = new MsgInfo(item.data, item.data.length);if (netdata != null)netdata.Get_Data(info, item.point);}@Overridepublic void ReturnData(byte[] data, int destuin, SocketAddress clientPoint) {try {client.send(new DatagramPacket(data, data.length, clientPoint));} catch (Exception e) {}}ClientOnLineListener online;}



0 0
原创粉丝点击