标题:
通过无线电跳频技术想到的端口跳变通信
[打印本页]
作者:
liuyy
时间:
2015-1-11 19:49
标题:
通过无线电跳频技术想到的端口跳变通信
server.java
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;
public class server {
public static void main(String[] args) throws Exception {
// 创建服务器端的socket对象
ServerSocket ss = new ServerSocket(1989);
// 监听连接
Socket socket = ss.accept();
// 直到连接建立好之后代码才会往下执行
System.out.println("客户端已连接...");
// 获得服务器端的输入流,从客户端接收信息
InputStream is = socket.getInputStream();
// 服务器端的输出流,向客户端发送信息
OutputStream os = socket.getOutputStream();
// 接收客户端的初始握信息
byte[] buffer = new byte[200];
int length = 0;
length = is.read(buffer);
String str = new String(buffer, 0, length);
System.out.println("客户端握手连接口令为:" + str);
// 需要使用跳端口发送的数据
byte[] buffer1 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n' };
for (int i = 0; i < 14; i++) {
// 一个标准的通信数据封包
byte[] fengbao = new byte[3];// 2字节端口好1字节附加数据
// 随机生成下次连接的端口号,必须保证端口号范围在1024~65535之间减少不必要的碰撞
int nexthost = new Random().nextInt(60000) + 1;
if (nexthost <= 1024)
nexthost += 1024;
// 封装一个通信数据包
fengbao[0] = buffer1[i]; // 填充附加数据
byte[] nexthost_byte = toByteArray(nexthost, 2);// 整形数据转换为字节数组
fengbao[1] = nexthost_byte[0];// 填充下次连接端口号
fengbao[2] = nexthost_byte[1];
// 服务器端的输出
os.write(fengbao);// 发送一个3字节的标准通信数据包
// 释放此次连接用到资源
is.close();
os.close();
socket.close();
// 准备开始下一次跳端口连接
if(i<13)
{
ss = new ServerSocket(nexthost);
System.out.println("等待客户端下一次连接...............");
socket = ss.accept();
System.out.println("客户端已连接此次连接端口号为:" + nexthost);
is = socket.getInputStream();
os = socket.getOutputStream();
}
}
}
// 将一个iArrayLen长度的整型数据转换为数组类型字节数组的低位是整型的低字节位
public static byte[] toByteArray(int iSource, int iArrayLen) {
byte[] bLocalArr = new byte[iArrayLen];
for (int i = 0; (i < 4) && (i < iArrayLen); i++) {
bLocalArr[i] = (byte) (iSource >> 8 * i & 0xFF);
}
return bLocalArr;
}
// 将byte数组bRefArr转为一个整数,字节数组的低位是整型的低字节位
public static int toInt(byte[] bRefArr, int iArrayLen) {
int iOutcome = 0;
byte bLoop;
for (int i = 0; i < iArrayLen; i++) {
bLoop = bRefArr[i];
iOutcome += (bLoop & 0xFF) << (8 * i);
}
return iOutcome;
}
}
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
client.java
public class client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("192.168.0.61", 1989);
// 客户端的输出流
OutputStream os = socket.getOutputStream();
// 将握手口令信息写入流,把这个信息传递给服务器
os.write("你好服务端测试下跳端口通信...".getBytes());
// 从服务器端接收信息
InputStream is = socket.getInputStream();
for(int i=0;i<14;i++)
{
byte[] fengbao = new byte[3];
byte[] host = new byte[2];
int nexthost;
is.read(fengbao);
host[0]=fengbao[1];
host[1]=fengbao[2];
nexthost=toInt(host,2);
System.out.println("下次连接端口为为:"+nexthost+"此次连接收到的附加数据为:"+(char)fengbao[0]);
//释放此次连接用到的资源
is.close();
os.close();
socket.close();
//准备开始下一次跳端口连接
if(i<13)
{
socket = new Socket("192.168.0.61", nexthost);
os = socket.getOutputStream();
is = socket.getInputStream();
}
}
}
//将一个iArrayLen长度的整型数据转换为数组类型字节数组的低位是整型的低字节位
public static byte[] toByteArray(int iSource, int iArrayLen) {
byte[] bLocalArr = new byte[iArrayLen];
for (int i = 0; (i < 4) && (i < iArrayLen); i++) {
bLocalArr[i] = (byte) (iSource >> 8 * i & 0xFF);
}
return bLocalArr;
}
// 将byte数组bRefArr转为一个整数,字节数组的低位是整型的低字节位
public static int toInt(byte[] bRefArr,int iArrayLen) {
int iOutcome = 0;
byte bLoop;
for (int i = 0; i <iArrayLen; i++) {
bLoop = bRefArr[i];
iOutcome += (bLoop & 0xFF) << (8 * i);
}
return iOutcome;
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1