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端(學校電腦桌機)
先執行Server端程式的畫面
在 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封包資訊
留言
張貼留言