找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3148|回复: 0
打印 上一主题 下一主题
收起左侧

通过无线电跳频技术想到的端口跳变通信

[复制链接]
跳转到指定楼层
楼主
ID:72008 发表于 2015-1-11 19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
server.java

  1. import java.io.InputStream;
  2. import java.io.OutputStream;
  3. import java.net.ServerSocket;
  4. import java.net.Socket;
  5. import java.util.Random;

  6. public class server {
  7. public static void main(String[] args) throws Exception {
  8. // 创建服务器端的socket对象
  9. ServerSocket ss = new ServerSocket(1989);
  10. // 监听连接
  11. Socket socket = ss.accept();
  12. // 直到连接建立好之后代码才会往下执行
  13. System.out.println("客户端已连接...");
  14. // 获得服务器端的输入流,从客户端接收信息
  15. InputStream is = socket.getInputStream();
  16. // 服务器端的输出流,向客户端发送信息
  17. OutputStream os = socket.getOutputStream();

  18. // 接收客户端的初始握信息
  19. byte[] buffer = new byte[200];
  20. int length = 0;
  21. length = is.read(buffer);
  22. String str = new String(buffer, 0, length);
  23. System.out.println("客户端握手连接口令为:" + str);

  24. // 需要使用跳端口发送的数据
  25. byte[] buffer1 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
  26. 'k', 'l', 'm', 'n' };
  27. for (int i = 0; i < 14; i++) {
  28. // 一个标准的通信数据封包
  29. byte[] fengbao = new byte[3];// 2字节端口好1字节附加数据
  30. // 随机生成下次连接的端口号,必须保证端口号范围在1024~65535之间减少不必要的碰撞
  31. int nexthost = new Random().nextInt(60000) + 1;
  32. if (nexthost <= 1024)
  33. nexthost += 1024;
  34. // 封装一个通信数据包
  35. fengbao[0] = buffer1[i]; // 填充附加数据
  36. byte[] nexthost_byte = toByteArray(nexthost, 2);// 整形数据转换为字节数组
  37. fengbao[1] = nexthost_byte[0];// 填充下次连接端口号
  38. fengbao[2] = nexthost_byte[1];
  39. // 服务器端的输出
  40. os.write(fengbao);// 发送一个3字节的标准通信数据包
  41. // 释放此次连接用到资源
  42. is.close();
  43. os.close();
  44. socket.close();
  45. // 准备开始下一次跳端口连接
  46. if(i<13)
  47. {
  48. ss = new ServerSocket(nexthost);
  49. System.out.println("等待客户端下一次连接...............");
  50. socket = ss.accept();
  51. System.out.println("客户端已连接此次连接端口号为:" + nexthost);
  52. is = socket.getInputStream();
  53. os = socket.getOutputStream();
  54. }

  55. }

  56. }

  57. // 将一个iArrayLen长度的整型数据转换为数组类型字节数组的低位是整型的低字节位
  58. public static byte[] toByteArray(int iSource, int iArrayLen) {
  59. byte[] bLocalArr = new byte[iArrayLen];
  60. for (int i = 0; (i < 4) && (i < iArrayLen); i++) {
  61. bLocalArr[i] = (byte) (iSource >> 8 * i & 0xFF);
  62. }
  63. return bLocalArr;
  64. }

  65. // 将byte数组bRefArr转为一个整数,字节数组的低位是整型的低字节位
  66. public static int toInt(byte[] bRefArr, int iArrayLen) {
  67. int iOutcome = 0;
  68. byte bLoop;

  69. for (int i = 0; i < iArrayLen; i++) {
  70. bLoop = bRefArr[i];
  71. iOutcome += (bLoop & 0xFF) << (8 * i);
  72. }
  73. return iOutcome;
  74. }

  75. }

  76. import java.io.InputStream;
  77. import java.io.OutputStream;
  78. import java.net.Socket;

  79. client.java
  80. public class client {
  81. public static void main(String[] args) throws Exception {
  82. Socket socket = new Socket("192.168.0.61", 1989);
  83. // 客户端的输出流
  84. OutputStream os = socket.getOutputStream();
  85. // 将握手口令信息写入流,把这个信息传递给服务器
  86. os.write("你好服务端测试下跳端口通信...".getBytes());
  87. // 从服务器端接收信息
  88. InputStream is = socket.getInputStream();

  89.    for(int i=0;i<14;i++)
  90.    {
  91. byte[] fengbao = new byte[3];
  92. byte[] host = new byte[2];
  93. int nexthost;
  94. is.read(fengbao);
  95. host[0]=fengbao[1];
  96. host[1]=fengbao[2];
  97. nexthost=toInt(host,2);
  98. System.out.println("下次连接端口为为:"+nexthost+"此次连接收到的附加数据为:"+(char)fengbao[0]);
  99. //释放此次连接用到的资源
  100. is.close();
  101. os.close();
  102. socket.close();
  103. //准备开始下一次跳端口连接
  104. if(i<13)
  105. {
  106. socket = new Socket("192.168.0.61", nexthost);
  107. os = socket.getOutputStream();
  108. is = socket.getInputStream();
  109. }
  110.    }

  111. }
  112. //将一个iArrayLen长度的整型数据转换为数组类型字节数组的低位是整型的低字节位
  113. public static byte[] toByteArray(int iSource, int iArrayLen) {
  114.    byte[] bLocalArr = new byte[iArrayLen];
  115.    for (int i = 0; (i < 4) && (i < iArrayLen); i++) {
  116.        bLocalArr[i] = (byte) (iSource >> 8 * i & 0xFF);
  117.    }
  118.    return bLocalArr;
  119. }

  120. // 将byte数组bRefArr转为一个整数,字节数组的低位是整型的低字节位
  121. public static int toInt(byte[] bRefArr,int iArrayLen) {
  122.    int iOutcome = 0;
  123.    byte bLoop;

  124.    for (int i = 0; i <iArrayLen; i++) {
  125.        bLoop = bRefArr[i];
  126.        iOutcome += (bLoop & 0xFF) << (8 * i);
  127.    }
  128.    return iOutcome;
  129. }

  130. }

复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表