Java_socket的連線

在今天所要探討的是我們的Socket之連線

在 Java Socket的類別中 很常拿來幫助使用者

建立 Client 和  Server 之連線

連線建立完就利用「輸入」、「輸出」之串流物件進行資料傳輸



TCP程式的 program 分為兩步驟

Step1. 先利用 Socket類別

Step2. 再利用串流物件



==========================================

首先這是我們的實體環境






























我們把學校桌機設為server端

另一邊為自帶筆電  設為 client端

【註:自帶筆電系統為win10 /  校內桌機系統為win7】


示意圖:































校內桌機

首先我們先來檢測telnet是否已經啟動






































































【在cmd指令下】
我們可清楚查看到server端的IP為120.125.48.1

而他屬於乙太網路(有線區網)

如果不想打cmd 這邊介紹兩個link來給大家找到自己主機的真實IP位址

(1) http://www.whatismyip.com.tw/
(2) http://myip.com.tw/








自帶筆電




























































































注意自帶筆電用的是 virtual IP會一直更新
若是在剛剛提供的兩個網頁做測試的話



按了F5後又出現不一樣的IP了!!!!!

















如何分辨虛擬IP 和 真實(實體)IP???

實體 IP :為了要辨識每一部電腦的位置,因此有了電腦 IP 位址的定義。是一個門牌的概念!


實體IP還可細分成
在台灣,實體IP還可分「浮動IP」或「固定IP」

浮動IP:每次上網時,電腦都會取得不同的IP位址

固定IP:每次上網IP都不變

如果自己的電腦想拿來架站或有此需求,申請固定IP會較適宜,

就很像其他客戶使用者要連到你這台電腦的網站

你的電腦是需要一組較為穩定的IP(門牌)
其餘使用者(就好比郵差、快遞)才知道怎麼找到你家寄送包裹、簽收.....


虛擬 IP : 是為了解決實體 IP不足所衍生而來


IP 位址僅為 xxx.xxx.xxx.xxx 的資料型態 , xxx 為 1-255 間的整數

幸好早期規劃 IP 時
就已經預留了三個網段的 IP

做為內部網域的虛擬 IP 之用。

這三個預留網段分別為

A Class:10.0.0.0 - 10.255.255.255
B Class:172.16.0.0 - 172.31.255.255
C Class:192.168.0.0 - 192.168.255.255


由於是虛擬 IP ,所以當您使用這些地址的時候,當然是有所限制的

1.私有位址的路由資訊不能對外散播
2.使用私有位址作為來源或目的地址的封包,不能透過Internet來轉送
3.關於私有位址的參考紀錄(如DNS),只能限在內部網路使用



=============================================================

【程式碼部分】

Server端(學校電腦桌機)


import java.io.*;
import java.net.*;
public class Socket_hw8_Server{
    static int port = 0;
    public static void main(String[] args) {
        if(args.length == 0){
            port = 1235;
        }else{
            port = Integer.parseInt(args[0]);
        }
        try{
            ServerSocket server = new ServerSocket(port);
            System.out.println("Server is created,waiting client...");
            Socket client = server.accept();
            System.out.println("Client is connected:" + client.getInetAddress());
            client.close();
        }catch(IOException er){
            System.out.println(er.toString());
        }
    }
}







先執行Server端程式的畫面




之後執行Client端程式(自帶筆電)


package hw8_socket;

import java.io.*;
import java.net.*;
public class Socket_hw8_Client {
    static int port = 0;    
    static String serverIP = "120.125.48.1";
    //請更改此IP為讀者環境中的伺服器IP    
    public static void main(String[] args) 
    {
        if(args.length == 0){
            port = 1235;
        }else{
            port = Integer.parseInt(args[0]);
        }
    
        try{
            Socket client = new Socket(serverIP,port);
            client.close();
        }catch(IOException er){
            System.out.println(er.toString());
        }
        
    }
}

在回過頭來看Server端


【Server端】
========================================




觀察一下  Wireshark接收TCP封包的情況

校內桌機(Server端)

挖賽  密密麻麻  這是要怎麼觀察阿!!!


使用密技指令
在上方   Addply display filter 這個欄位中 key 入

tcp.port == 1239 ----->你的程式碼打的喔(看你port設定為捨麼!?!?)

TCP 三方交握





這是第一欄位







第一次握手


第二次握手


第三次握手



========================================


【Client端】
========================================






========================================

接著我們想要實現UDP的連結



【程式碼部分】



Server端

import java.io.*;
import java.net.*;
public class Socket_hw8_Server{
    static int port = 0;
    public static void main(String[] args) {
        
        DatagramSocket server1 = null;
        int socket_no = 3333;
        
        if(args.length == 0){
            port = 1235;
        }else{
            port = Integer.parseInt(args[0]);
        }
        
        try{
            ServerSocket server = new ServerSocket(port);
            System.out.println("Server is created,waiting client...");
            Socket client = server.accept();
            System.out.println("Client is connected:" + client.getInetAddress());
            client.close();
            
            server1 = new DatagramSocket(socket_no);
            System.out.println("UDP Server is created waiting for data...");
            byte[] buffer = new byte[20];
            for(int i=0;i<20;i++)
            {
                buffer[i] = ' ';
            }
            while(true)
            {
                DatagramPacket request = new DatagramPacket(buffer ,buffer.length );
                server1.receive(request);
                System.out.println("Received Data:"+new String(request.getData()));
                for(int  i=0;i<20;i++)
                {
                    buffer[i] = ' ';
                }
            }                                            
            
        }
        catch(SocketException e){
            System.out.println("Socket Error");
        }
        catch(IOException e){
            System.out.println("Error");
        }
        finally{
            if(server1!=null)
                server1.close();
        }
    }
}



Client端

package hw8_socket;

import java.io.*;
import java.net.*;
public class Socket_hw8_Client {
    static int port = 0;    
    static String serverIP = "120.125.48.1";
    static DatagramSocket client2 = null;
    //請更改此IP為讀者環境中的伺服器IP    
    public static void main(String[] args) 
    {
        if(args.length == 0){
            port = 1235;
        }else{
            port = Integer.parseInt(args[0]);
        }
    
        try{
            Socket client = new Socket(serverIP,port);
            client.close();
            
            client2 = new DatagramSocket();
            InetAddress HostIP = InetAddress.getByName("120.125.48.1");
            int iport = 3333;
            
            System.out.println("Input Data:....");
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            String temp;
            temp = in.readLine();
            byte[] inputStr = temp.getBytes();
            
            DatagramPacket request = new DatagramPacket(inputStr , temp.length(),HostIP,iport);
            client2.send(request);
            
        }
        catch(SocketException e)
        {
            System.out.println("Socket error");
        }
        catch(IOException e)
        {
            System.out.println("error");
        }
        finally
        {
            if(client2!=null)
                client2.close();
        }
        
    }
}



Server端

程式碼




UDP封包資訊






Client端

程式碼






UDP封包資訊






留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題