黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java客戶端與服務器程序

Java客戶端與服務器程序

更新時間:2022-06-21 12:36:21 來源:動力節點 瀏覽1615次

Java中的客戶端服務器程序

客戶端和服務器是套接字編程的兩個主要組件。客戶端是請求服務的計算機/節點,服務器是響應客戶端的計算機/節點。在 Java 中,使用套接字編程,我們可以連接客戶端和服務器。

套接字是用于發送和接收消息的端點。它是 IP 地址和端口號的組合。客戶端-服務器程序中使用了兩種類型的套接字:一種是客戶端套接字,另一種是服務器套接字。在客戶端-服務器程序中,客戶端必須知道客戶端想要發送服務請求的服務器端點的位置(IP 地址和端口號)。在計算機世界中,客戶端和服務器都是應用程序。服務器程序使用服務器套接字,而客戶端程序使用客戶端套接字進行通信。

以下 Java 程序說明了如何在客戶端和服務器之間建立通信。讓我們從客戶端程序開始。

客戶端程序

// 導入語句
 導入java.net.*;
 導入java.io.*;
 導入 java.util.Scanner;
 公共類客戶端
 {
     // 初始化套接字和輸入輸出流
     私有數據輸出流數據輸出 = null;
     私人掃描儀 sc = null;
     私有套接字 skt = null;
     // 構造函數來創建具有給定 IP 和端口地址的套接字
     公共客戶端(字符串地址,int 端口)
     {
         // 與服務器建立連接
         嘗試
         {
              // 創建一個socket對象
             skt = 新套接字(地址,端口);
             System.out.println("連接建立!!");
             System.out.println("輸入 \"Finish\" 終止連接。");
             // 從用戶那里獲取輸入
             sc = 新掃描儀(System.in);
             // 在套接字上打開輸出流
             dataOut = new DataOutputStream(skt.getOutputStream());
         }
         catch(UnknownHostException 呃)
         {
             System.out.println(uh);
         }
         捕捉(IOException io)
         {
             System.out.println(io);
         }
         // 存儲用戶輸入的信息
         字符串 str = "";
         // 繼續讀取直到輸入“Finish”
         而(!str.equals(“完成”))
         {
             輸入 = sc.nextLine(); // 讀取輸入
             嘗試
             {
                 dataOut.writeUTF(str); // 寫入底層輸出流
             }
             // 用于在寫入輸出流時處理錯誤
             捕捉(IOException io)
             {
                 System.out.println(io);
             }
         }
         System.out.println("連接終止!!");
         // 用于關閉連接
         嘗試
         {
             數據輸出.close();
             skt.close();
         }
         捕捉(IOException io)
         {
             System.out.println(io);
         }
     }
     公共靜態無效主要(字符串argvs [])
     {
          // 創建類Client的對象
         ClientSide client = new ClientSide("localhost", 6666);
     }
 }

解釋:我們知道要建立連接,客戶端和服務器端都需要套接字。以下語句在客戶端創建一個套接字:

sk = 新套接字(地址,端口);

Socket 類的構造函數有兩個參數:一個是地址(IP 地址),另一個是端口(端口號),并創建了 Socket 類的對象。在代碼中,我們使用了端口號 6666。這里,我們使用了 localhost,因為客戶端應用程序和服務器應用程序運行在同一個系統上。通常,客戶端程序和服務器程序位于不同的系統上。在這種情況下,使用運行服務器的系統的 IP 地址而不是 localhost。確保在這種情況下使用完全限定的 IP 地址/名稱。

端口號 6666 表示客戶端正在嘗試在端口 6666 上建立與服務器的連接。如果服務器在端口 6666 上,則連接建立;否則,不是。

該聲明

dataOut = new DataOutputStream(skt.getOutputStream());
 dataOut.writeUTF(str);

寫入在套接字上打開的輸出流。服務器正在讀取輸出流上寫入的任何內容。這里,str是一個字符串,它讀取用戶輸入的任何內容。變量str的讀取將繼續,直到用戶輸入“Finish”。如果在寫入底層流時發生任何錯誤,IOException的 catch 塊就會出現。

如果我們在 Socket 類的構造函數的參數中提供任何無效的 IP 地址,則上述 catch 塊的以下代碼片段將生效。

catch(UnknownHostException 呃)
 {
 System.out.println(uh);
 }

例如,如果我們鍵入“locahost”而不是“localhost”,則上述 catch 塊的語句將生效。

現在,讓我們討論一下服務器端程序。

服務器端程序

// 導入語句
 導入java.net.*;
 導入java.io.*;
 公共類服務器
 {
     //初始化輸入流和套接字
     私有數據輸入流 inStream = null;
     私有套接字 skt = null;
     私有 ServerSocket srvr = null;
     // 類Server的構造函數
     公共服務器(int 端口)
     {
         // 啟動服務器并等待客戶端 
         嘗試
         {
             srvr = 新服務器套接字(端口);
             System.out.println("服務器啟動");
             System.out.println("正在等待客戶端連接...");  
             skt = srvr.accept(); // 等待客戶端發送連接請求
             System.out.println("與客戶端連接!!");
             // 使用套接字接收來自客戶端的輸入消息
             inStream = new DataInputStream(skt.getInputStream());
             字符串 str = ""; // 用于讀取客戶端發送的消息的變量
             // 直到客戶端發送“完成”,
             // 繼續閱讀消息
             而(!str.equals(“完成”))
             {
                 嘗試
                 {
                     // 從底層流中讀取
                     str = inStream.readUTF();
                     // 在控制臺上打印讀取的消息
                     System.out.println(str);
                 }
                // 用于處理錯誤
                 捕捉(IOException io)
                 {
                     System.out.println(io);
                 }
             }
             //關閉已建立的連接
             skt.close();
             inStream.close();
             System.out.println("連接關閉!!");
         }
         // 處理錯誤
         捕獲(IOException 我)
         {
             System.out.println(i);
         }
     }
     公共靜態無效主要(字符串argvs [])
     {
         // 創建類ServerSide的對象
         服務器服務器=新服務器(6666);
     }
 }

解釋:聲明

srvr = 新服務器套接字(端口);

創建一個新套接字并將其綁定到端口號,該端口號作為參數(端口)傳遞給類ServerSocket的構造函數。在代碼中,我們使用了端口號 6666。這意味著服務器正在偵聽端口號 6666,客戶端必須使用此端口號(6666)連接到服務器。

該聲明

skt = srvr.accept();

服務器使用它來接受來自客戶端的連接請求。服務器在調用方法accept() 后等待。等待一直持續到服務器從客戶端收到連接請求。在這里,等待意味著在accept()方法之后編寫的任何語句在服務器收到連接請求之前不會被執行。在這個位置,我們說服務器正在監聽給定的端口號,在我們的例子中是 6666。

為了讀取客戶端發送的消息,我們必須打開一個到套接字的輸入流。以下語句也是如此。

inStream = new DataInputStream(skt.getInputStream());

getInputStream()方法返回附加到套接字的輸入流。在 Java 中,數據輸出流用于寫入可以稍后由輸入流讀取的數據。上述聲明中也發生了同樣的情況。當我們調用DataInputStream類的readUTF()方法時,我們從客戶端發送的任何內容都會被讀取。下面的語句做同樣的事情

str = inStream.readUTF();

在客戶端,我們使用writeUTF()方法對流進行寫入部分。同樣,在服務器端,我們在這里使用了 readUTF() 從流中讀取部分。readUTF ()方法返回一個 Unicode 字符串,我們將其存儲在變量str 中。繼續閱讀,直到客戶端發送“完成”一詞。閱讀“完成”一詞后,連接將關閉。下面的書面陳述達到了同樣的效果。

skt.close();
 inStream.close();

執行步驟

首先,應該執行服務器端程序。這是因為,當我們開始執行客戶端程序時,它開始在端口號 6666 處尋找服務器。由于我們沒有先執行服務器端程序,因此不會有服務器在偵聽端口號 6666。因此,客戶端程序引發NullPointerException。因此,客戶端程序必須在服務器端程序執行之后執行。

為了執行上述程序,打開兩個命令提示符,一個用于客戶端程序,另一個用于服務器端程序。分別使用命令javac和java進行編譯和執行。

輸出:

首先,我們執行服務器端程序。

我們看到執行后,服務器等待客戶端連接。現在,執行客戶端程序并觀察服務器如何響應。

我們看到服務器響應消息Connected with a client!! 現在,連接已經建立,我們可以向連接的服務器發送消息。觀察以下快照。

1234, 78, ..., Russia 是客戶端發送的輸入。這些輸入消息在服務器端顯示。要終止連接,我們必須輸入單詞 Finish。

輸入“完成”一詞后,兩邊的連接都關閉了。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 精品国产_亚洲人成在线高清 | 男女午夜爽爽 | 成年黄网站色大免费全看 | 一区二区三区免费在线 | 国产成人精品日本亚洲专一区 | 欧美伊人久久 | 天堂资源吧 | 国产精品欧美一区二区三区不卡 | 午夜性刺激在线观看视频 | 午夜视频十八嗯嗯啊免费 | 日韩美女色高清在线看 | 任你躁欧美一级在线精品 | 国产视频一区二区 | 欧美精品一区二区精品久久 | 一级毛片a | 色列里番h本全彩无遮挡影片 | 中文亚洲动漫精品 | 免费一级毛片清高播放 | 日韩一区二区三区四区不卡 | 99精品视频3| 男女乱淫真视频免费一级毛片 | 伊人久久大香线 | 黄色大片网站在线观看 | 久久成人午夜 | heisi视频网在线观看 | 永久免费的啪啪免费的网址 | 伦理片中文字幕2019在线 | www.五月激情 | 视频一区二区在线 | 久久久亚洲精品国产 | 男女男精品视频网站 | 男人透女人超爽视频免费 | 最近的中文字幕免费视频1 最近的中文字幕大全免费版 | 韩国伦理片手机在线观看 | 91青草久久久久久清纯 | kk4kk免费视频毛片 | 亚洲福利精品 | 伊人激情综合 | 91亚洲最新精品 | 任我鲁这里有精品视频在线播 | 999视频精品全部免费观看 |