|
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;
- }
- }
復制代碼
|
|