|
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;
- }
- }
复制代码
|
|