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 類
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 實例代碼。
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 地址和端口號,代碼如下所示。
(2) 建立與服務器端的連接并將數據發送到服務器端,代碼如下所示。
(3) 從輸入流中讀出服務器的反饋信息并輸出到控制臺,代碼如下所示。
(4) 關閉輸入/輸出流以及 Socket 對象,代碼如下所示。
(5) 創建一個類作為服務器端,編寫 main() 方法,創建 ServerSocket、Socket、InputStream、OutputStream 以及端口號并初始化,代碼如下所示。
(6) 開啟服務器并接收客戶端發送的數據,代碼如下所示。
(9) 運行服務器端程序代碼,運行結果如下所示。
(10) 為了使程序的結果更加清晰,在步驟 (2) 的代碼最后加入一句代碼“Thread.sleep(1000);”。接著運行客戶端程序代碼,剛開始會出現如下所示的運行結果。
緊接著又會出現如下所示的運行結果。
客戶端的反饋為:我是服務器端客戶端與服務器端的簡單通信
在了解 TCP 通信中 ServerSocket 類和 Socket 類的簡單應用之后,本節將編寫一個案例實現客戶端向服務器發送信息,服務器讀取客戶端發送的信息,并將讀取的數據寫入到數據流中。
首先來看一下客戶端的代碼,如下所示:
如上述代碼所示,客戶端代碼主要是使用 Socket 連接 IP 為 127.0.0.1(本機)的 5000 端口。在建立連接之后將隨機生成的數字使用 PrintWriter 類輸出到套接字。休眠 2 秒后,再次發送隨機數,如此循環。
再來看一個服務器端的代碼,如下所示:
如上述代碼所示,服務器端與客戶端代碼類似,首先使用 ServerSocket 在 IP為127.0.0.1(本機)的 5000 端口建立套接字監聽。在 accept() 方法接收到客戶端的 Socket 實例之后調用 BufferedReader 類的 readLine() 方法,從套接字中讀取一行作為數據,再將它輸出到控制后休眠 2 秒。
要運行本案例,必須先執行服務器端程序,然后執行客戶端程序。客戶端每隔 2 秒向服務器發送一個數字,如下所示。
服務器端會將客戶端發送的數據輸出到控制臺,如下所示。
?
綜上所述,答案為B
我是歌謠,有什么不合理之處歡迎之處,也歡迎補充。喜歡敲代碼,沒事刷刷題
閱讀目錄(置頂)(長期更新計算機領域知識)
閱讀目錄(置頂)(長期更新計算機領域知識)
閱讀目錄(置頂)(長期科技領域知識)
歌謠帶你看java面試題
總結
以上是生活随笔為你收集整理的Java面试题17 牛客 下面哪个选项正确创建socket连接?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ux设计师薪水_客户现在也是UX设计师
- 下一篇: 分步表单_角色创建分步指南