日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java面试题17 牛客 下面哪个选项正确创建socket连接?

發布時間:2023/12/10 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java面试题17 牛客 下面哪个选项正确创建socket连接? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java面試題17 牛客 下面哪個選項正確創建socket連接?

Socket?s?=?new?Socket(8080); Socket?s?=?new?Socket(“192.168.1.1”,8080) SocketServer?s?=?new?Socket(8080); Socket?s?=?new?SocketServer(“192.168.1.1”,8080)

懵逼樹上懵逼果,懵逼樹下你和我,二話不說看看解析

這題主要是區別號客戶端和服務端的創建方法

客戶端對象:Socket s = new Socket("127.0.0.1",6666);

服務端對象:ServerSocket ss = new ServerSocket(6666);

監聽服務器的連接:

? ? s=ss.accept()

TCP 網絡程序是指利用 Socket 編寫的通信程序。利用 TCP 協議進行通信的兩個應用程序是有主次之分的,一個是服務器程序,一個是客戶端程序,兩者的功能和編寫方法不太一樣。其中 ServerSocket 類表示 Socket 服務器端,Socket 類表示 Socket 客戶端,兩者之間的交互過程如下:

  • 服務器端創建一個 ServerSocket(服務器端套接字),調用 accept() 方法等待客戶端來連接。
  • 客戶端程序創建一個 Socket,請求與服務器建立連接。
  • 服務器接收客戶的連接請求,同時創建一個新的 Socket 與客戶建立連接,服務器繼續等待新的請求。
  • ServerSocket 類

    ServerSocket 類是與 Socket 類相對應的用于表示通信雙方中的服務器端,用于在服務器上開一個端口,被動地等待數據(使用 accept() 方法)并建立連接進行數據交互。

    服務器套接字一次可以與一個套接字連接,如果多臺客戶端同時提出連接請求,服務器套接字會將請求連接的客戶端存入隊列中,然后從中取出一個套接字與服務器新建的套接字連接起來。若請求連接大于最大容納數,則多出的連接請求被拒絕;默認的隊列大小是 50。

    下面簡單介紹一下 ServerSocket 的構造方法和常用方法。

    ServerSocket 的構造方法

    ServerSocket 的構造方法如下所示。

    • ServerSocket():無參構造方法。
    • ServerSocket(int port):創建綁定到特定端口的服務器套接字。
    • ServerSocket(int port,int backlog):使用指定的 backlog 創建服務器套接字并將其綁定到指定的本地端口。
    • ServerSocket(int port,int backlog,InetAddress bindAddr):使用指定的端口、監聽 backlog 和要綁定到本地的 IP 地址創建服務器。


    在上述方法的參數中 port 指的是本地 TCP 端口,backlog 指的是監聽 backlog,bindAddr 指的是要將服務器綁定到的 InetAddress。

    創建 ServerSocket 時可能會拋出 IOException 異常,所以要進行異常捕捉。如下所示為使用 8111 端口的 ServerSocket 實例代碼。

    ?
  • try
  • {
  • ServerSocket serverSocket=new ServerSocket(8111);
  • }
  • catch(IOException e)
  • {
  • e.printStackTrace();
  • }
  • ServerSocket 的常用方法

    ServerSocket 的常用方法如下所示。

    • Server accept():監聽并接收到此套接字的連接。
    • void bind(SocketAddress endpoint):將 ServerSocket 綁定到指定地址(IP 地址和端口號)。
    • void close():關閉此套接字。
    • InetAddress getInetAddress():返回此服務器套接字的本地地址。
    • int getLocalPort():返回此套接字監聽的端口。
    • SocketAddress getLocalSoclcetAddress():返回此套接字綁定的端口的地址,如果尚未綁定則返回 null。
    • int getReceiveBufferSize():獲取此 ServerSocket 的 SO_RCVBUF 選項的值,該值是從 ServerSocket 接收的套接字的建議緩沖區大小。


    調用 accept() 方法會返回一個和客戶端 Socket 對象相連接的 Socket 對象,服務器端的 Socket 對象使用 getOutputStream() 方法獲得的輸出流將指定客戶端 Socket 對象使用 getInputStream() 方法獲得那個輸入流。同樣,服務器端的 Socket 對象使用的 getInputStream() 方法獲得的輸入流將指向客戶端 Socket 對象使用的 getOutputStream() 方法獲得的那個輸出流。也就是說,當服務器向輸出流寫入信息時,客戶端通過相應的輸入流就能讀取,反之同樣如此,整個過程如圖 1 所示。

    圖1 服務器與客戶端連接示意圖

    例 1

    了解上面的基礎知識后,下面使用 ServerSocket 類在本機上創建一個使用端口 8888 的服務器端套接字,實例代碼如下所示。

    ?

    public static void main(String[] args) { try { //在8888端口創建一個服務器端套接字 ServerSocket serverSocket=new ServerSocket(8888); System.out.println("服務器端Socket創建成功"); while(true) { System.out.println("等待客戶端的連接請求"); //等待客戶端的連接請求 Socket socket=serverSocket.accept(); System.out.println("成功建立與客戶端的連接"); } } catch(IOException e) { e.printStackTrace(); } }

    如上述代碼所示,在成功建立 8888 端口的服務器端套接字之后,如果沒有客戶端的連接請求,則 accept() 方法為空,所以不會輸出“成功建立與客戶端的連接”,運行結果如下所示。

    服務器端S.ocket創違成功 等待客戶端的連接請求

    Socket 類

    Socket 類表示通信雙方中的客戶端,用于呼叫遠端機器上的一個端口,主動向服務器端發送數據(當連接建立后也能接收數據)。下面簡單介紹一下 Socket 類的構造方法和常用方法。

    Socket 的構造方法

    Socket 的構造方法如下所示。

    • Socket():無參構造方法。
    • Socket(InetAddress address,int port):創建一個流套接字并將其連接到指定 IP 地址的指定端口。
    • Soclcet(InetAddress address,int port,InetAddress localAddr,int localPort):創建一個套接字并將其連接到指定遠程地址上的指定遠程端口。
    • Socket(String host,int port):創建一個流套接字并將其連接到指定主機上的指定端口。
    • Socket(String host,int port,InetAddress localAddr,int localPort):創建一個套接字并將其連接到指定遠程地址上的指定遠程端口。Socket 會通過調用 bind() 函數來綁定提供的本地地址及端口。


    在上述方法的參數中,address 指的是遠程地址,port 指的是遠程端口,localAddr 指的是要將套接字綁定到的本地地址,localPort 指的是要將套接字綁定到的本地端口。

    Socket 的常用方法

    Socket 的常用方法如下所示。

    • void bind(SocketAddress bindpoint):將套接字綁定到本地地址。
    • void close():關閉此套接字。
    • void connect(SocketAddress endpoint):將此套接字連接到服務器。
    • InetAddress getInetAddress():返回套接字的連接地址。
    • InetAddress getLocalAddress():獲取套接字綁定的本地地址。
    • InputStream getInputStream():返回此套接字的輸入流。
    • OutputStream getOutputStream():返回此套接字的輸出流。
    • SocketAddress getLocalSocketAddress():返回此套接字綁定的端點地址,如果尚未綁定則返回 null。
    • SocketAddress getRemoteSocketAddress():返回此套接字的連接的端點地址,如果尚未連接則返回 null。
    • int getLoacalPort():返回此套接字綁定的本地端口。
    • intgetPort():返回此套接字連接的遠程端口。

    例 2

    編寫 TCP 程序,包括一個客戶端和一個服務器端。要求服務器端等待接收客戶端發送的內容,然后將接收到的內容輸出到控制臺并做出反饋。

    (1) 創建一個類作為客戶端,首先在 main() 方法中定義一個 Socket 對象、一個 OutputStream 對象和一個 InputStream 對象并完成初始化。接著定義服務器端的 IP 地址和端口號,代碼如下所示。

    public static void main(String[] args) { Socket socket=null; OutputStream out=null; InputStream in=null; String serverIP="127.0.0.1"; //服務器端 IP 地址 int port=5000; //服務器端端口號 }


    (2) 建立與服務器端的連接并將數據發送到服務器端,代碼如下所示。

    socket=new Socket(serverIP,port); //建立連接 out=socket.getOutputStream(); //發送數據 out.write("我是客戶端數據 ".getBytes());


    (3) 從輸入流中讀出服務器的反饋信息并輸出到控制臺,代碼如下所示。

    byte[] b=new byte[1024]; in=socket.getInputStream(); int len=in.read(b); System.out.println(" 服務器端的反饋為:"+new String(b,0,len));


    (4) 關閉輸入/輸出流以及 Socket 對象,代碼如下所示。

    in.close(); out.close(); socket.close();


    (5) 創建一個類作為服務器端,編寫 main() 方法,創建 ServerSocket、Socket、InputStream、OutputStream 以及端口號并初始化,代碼如下所示。

    ServerSocket ServerSocket=null; Socket socket=null; InputStream in=null; OutputStream out=null; int port=5000;


    (6) 開啟服務器并接收客戶端發送的數據,代碼如下所示。

    ServerSocket=new ServerSocket(port); //創建服務器套接字 System.out.println("服務器開啟,等待連接。。。"); socket=ServerSocket.accept(); //獲得連接 //接收客戶端發送的內容 in=socket.getInputStream(); byte[] b=new byte[1024]; int len=in.read(b); System.out.println("客戶端發送的內容為:"+new String(b,0,len)); (7) 使用輸出流對象將信息反饋給客戶端,代碼如下所示。 out=socket.getOutputStream(); out.write("我是服務器端".getBytes()); 8) 關閉輸入/輸出流、Socket 對象以及 ServerSocket 對象,代碼如下所示。 in.close(); out.close(); ServerSocket.close(); socket.close();


    (9) 運行服務器端程序代碼,運行結果如下所示。

    服務器開啟,等待連接。。。


    (10) 為了使程序的結果更加清晰,在步驟 (2) 的代碼最后加入一句代碼“Thread.sleep(1000);”。接著運行客戶端程序代碼,剛開始會出現如下所示的運行結果。

    服務器開啟,等待連接。。。 客戶端發送的內容為:我是客戶端數據

    緊接著又會出現如下所示的運行結果。

    客戶端的反饋為:我是服務器端

    客戶端與服務器端的簡單通信

    在了解 TCP 通信中 ServerSocket 類和 Socket 類的簡單應用之后,本節將編寫一個案例實現客戶端向服務器發送信息,服務器讀取客戶端發送的信息,并將讀取的數據寫入到數據流中。

    首先來看一下客戶端的代碼,如下所示:

    public class SocketDemo { public static void main(String[] args) { Socket socket=null; PrintWriter out=null; BufferedReader in=null; String serverIP="127.0.0.1"; //服務器端ip地址 int port=5000; //服務器端端口號 try { socket=new Socket(serverIP,port); in=new BufferedReader(new InputStreamReader(socket.getInputStream())); out=new PrintWriter(socket.getOutputStream(),true); while(true) { int number=(int)(Math.random()*10)+1; System.out.println("客戶端正在發送的內容為:"+number); out.println(number); Thread.sleep(2000); } } catch(IOException | InterruptedException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } } }


    如上述代碼所示,客戶端代碼主要是使用 Socket 連接 IP 為 127.0.0.1(本機)的 5000 端口。在建立連接之后將隨機生成的數字使用 PrintWriter 類輸出到套接字。休眠 2 秒后,再次發送隨機數,如此循環。

    再來看一個服務器端的代碼,如下所示:

    package ch16; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class SocketDemoServer1 { public static void main(String[] args) { ServerSocket serverSocket=null; Socket clientSocket=null; BufferedReader in=null; int port=5000; String str=null; try { serverSocket=new ServerSocket(port); //創建服務器套接字 System.out.println("服務器開啟,等待連接。。。"); clientSocket=serverSocket.accept();// 獲得鏈接 //接收客戶端發送的內容 in=new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); while(true) { str=in.readLine(); System.out.println("客戶端發送的內容為:"+str); Thread.sleep(2000); } } catch(IOException | InterruptedException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } } }


    如上述代碼所示,服務器端與客戶端代碼類似,首先使用 ServerSocket 在 IP為127.0.0.1(本機)的 5000 端口建立套接字監聽。在 accept() 方法接收到客戶端的 Socket 實例之后調用 BufferedReader 類的 readLine() 方法,從套接字中讀取一行作為數據,再將它輸出到控制后休眠 2 秒。

    要運行本案例,必須先執行服務器端程序,然后執行客戶端程序。客戶端每隔 2 秒向服務器發送一個數字,如下所示。

    客戶端正在發送的內容為:10 客戶端正在發送的內容為:5 客戶端正在發送的內容為:10 客戶端正在發送的內容為:4 客戶端正在發送的內容為:3

    服務器端會將客戶端發送的數據輸出到控制臺,如下所示。

    ?

  • 服務器幵啟,等待連接。。。
  • 客戶端發送的內容為:7
  • 客戶端發送的內容為:2
  • 客戶端發送的內容為:10
  • 客戶端發送的內容為:5
  • 客戶端發送的內容為:10
  • 綜上所述,答案為B

    我是歌謠,有什么不合理之處歡迎之處,也歡迎補充。喜歡敲代碼,沒事刷刷題

    閱讀目錄(置頂)(長期更新計算機領域知識)

    閱讀目錄(置頂)(長期更新計算機領域知識)

    閱讀目錄(置頂)(長期科技領域知識)

    歌謠帶你看java面試題

    總結

    以上是生活随笔為你收集整理的Java面试题17 牛客 下面哪个选项正确创建socket连接?的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。