您的位置:首页 > 理论基础 > 计算机网络

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

2014-01-11 14:15 405 查看
------- 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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: