黑马程序员-- udp(心跳包) 编写网络管理类 笔记
2014-01-11 14:15
405 查看
------- android培训、java培训、期待与您交流! ----------
总结,这是我写的udp管理类。,当时用在小例子上,便于复用性,写成管理类。
包含心跳包的发送
客户端myudpclient
服务器myudpserver
总结,这是我写的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; }
相关文章推荐
- 黑马程序员——自学笔记15(网络传输2—UDP传输和TCP传输)
- 黑马程序员_网络编程学习笔记-->代码主要是对UDP协议的讲解
- 黑马程序员_学习笔记:15) 网络编程:Socket(udp、tcp)
- 黑马程序员_温习 网络编辑一 (个人笔记)摘要(网络概述---网络参考模型---网络传输要素---IP地址---端口----传输协议(UDP -- TCP)---Socket机制 )
- 黑马程序员_温习 网络编辑二 (个人笔记)概要(UDP传输演示)
- 黑马程序员-用UDP编写网络聊天程序
- 黑马程序员-------Java笔记--------网络编程(UDP与TCP基本步骤)
- 黑马程序员---网络,tcp udp 笔记
- 黑马程序员_网络编程UDP之学习笔记
- 黑马程序员————Java基础日常笔记---网络编程
- 黑马程序员_网络编程UDP与TCP
- 黑马程序员_java基础(12)网络编程之UDP
- 黑马程序员------网络编程复习笔记
- 黑马程序员---网络学习笔记
- 黑马程序员 ---网络编程 UDP
- 网络基础学习笔记二------UDP通信之客户端
- 黑马程序员________Java中UDP和TCP网络编程学习笔记
- 黑马程序员_学习笔记第23天——网络编程TCP/UDP
- 黑马程序员_JAVA网络编程基础概念+URL类学习笔记
- 黑马程序员-java学习笔记-网络编程