您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關使用java如何實現解析Socket,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
在Java編程之中,我們通常都會接觸到網絡編程,那么不可避免地就會接觸到Socket通信,下面我將對Socket進行簡單的解析,并給出雙方通訊的代碼實現方案
首先我們來介紹一下整個Socket的通信過程
首先服務端先創建一個SocketServer,那么創建一個SocketServer需要我們指定端口號,如下
ServerSocket serverSocket=new ServerSocket(8888);
像上面這樣我們就簡單的開了一個端口號為8888的ServerSocket了
接下來我們需要去接收來自客戶端的連接請求,也就是圖中的Other Socket,我們可以利用SockerServer的accept方法來建立連接,并且這個方法會返回一個Socket,用于和Other Socker進行通信,簡單來說,我們就是利用SockerServer來獲取Socket,然后利用這個Socket和別人通信
接下來我們獲取Socket的輸入輸出流,實現發送和接收信息,到此,我們已經知道兩方進行Socket通信的基本思路了
接下來我們來看看關于ServerSocket以及Socket的一些關鍵方法
ServerSocket
首先我們看一下ServerSocket的構造方法,一共有4種:
1、無參的構造方法 :
ServerSocket(), 返回沒有綁定端口號的ServerSocket實例
2、含一個參數的構造方法 :
ServerSocket(int port),返回綁定給定端口號的ServerSocket實例
3、含兩個參數的構造方法 :
ServerSocket(int port, int backlog),返回綁定給定端口號的ServerSocket實例,并且設定同步隊列(syns queue)的大小
4、含三個參數的構造方法:
ServerSocket(int port, int backlog, InetAddress bindAddr),返回綁定給定端口號的ServerSocket實例,并且設定同步隊列(syns queue)的大小以及綁定給定的IP地址
主要看它的一些方法:
accept()
這個方法監聽連接,一旦連接就返回一個Socket用于通信,需要注意的是,該方法為阻塞方法,如果沒有連接程序并不會繼續執行下去
close()
關閉Socket,如果accept還在阻塞的話,就會拋出一個SocketException的異常
關于ServerSocket就不多加贅述了,我們來看一看Socket
Socket
構造方法依然存在多種,這里只給出一個較為典型的
Socket(String host, int port),第一個參數是主機的IP地址作為字符串傳入,第二個參數為端口號
getInputStream(), getOutputStream()
獲得Socket的輸入輸出流,我們可以利用BufferReader以及PrintWriter來對這兩個流進行操作,如下:
BufferReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); PrintWriter writer = new PrintWriter( new OutputStreamWriter(socket.getOutputStream()));
下面簡單編寫一個雙方互相通信的java實現
首先是服務端
import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * Created by Mezereon on 2017/3/1. */ public class TCPServer { private Socket socket; private ServerSocket serverSocket; private BufferedReader reader; private PrintWriter writer; private Scanner scanner = new Scanner(System.in); //開啟服務 public void run() throws IOException { startTheSocket(); } public void startTheSocket() throws IOException { serverSocket=new ServerSocket(18080); //打開18080端口等待連接 acceptTheSocket();//接受連接并且初始化Socket,reader,writer openTheNewThreadToGetMessageFromClient(); while(true) { getYourMessage();//獲取鍵盤數據并作為輸入 } } //接受連接并且初始化Socket,reader,writer private void acceptTheSocket() throws IOException { socket=serverSocket.accept();//阻塞方法,用于接受Socket連接 System.out.println("Some one connect me ,it is "+socket.getLocalSocketAddress());//打印地址 System.out.println("It's port is "+socket.getPort());//打印端口號 reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//獲得輸入流 writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//獲得輸出流 } //掃描鍵盤并輸入數據 private void getYourMessage() throws IOException { String yourMessage = scanner.nextLine(); checkYourMessage(yourMessage);//檢查發送給客戶端的信息 writer.println(yourMessage);//發送信息 writer.flush();//flush方法用于清空緩沖區,注意的是如果不flush你的信息可能發不出去一直存留在緩沖區 } //用于檢查是否退出 private void checkYourMessage(String yourMessage) throws IOException { //關閉各種 if (yourMessage.equals("exit")) { socket.close(); writer.close(); reader.close(); System.exit(0); } } //開啟一個新的線程來監聽客戶端發來的信息 private void openTheNewThreadToGetMessageFromClient() throws IOException { //開啟一個新的線程 new Thread(new Runnable() { @Override public void run() { getTheMessageFromClient(); } }).start(); } //不斷循環來獲取客戶端發來的信息 private void getTheMessageFromClient() { while(true) { String messageFromClient = null; try { messageFromClient = reader.readLine(); } catch (IOException e) { e.printStackTrace(); } printTheMessage(messageFromClient);//打印客戶端發來的信息 } } //打印客戶端發來的信息 private void printTheMessage(String messageFromClient) { if(messageFromClient!=null) System.out.println("He say:"+messageFromClient); } }
然后開始編寫客戶端:
import java.io.*; import java.net.Socket; import java.util.Scanner; /** * Created by Mezereon on 2017/2/27. */ public class TCPClient { private Socket socket; private BufferedReader reader ; private PrintWriter writer; private Scanner scanner = new Scanner(System.in); //開啟Socket來連接 public void run() throws IOException{ startTheSocket(); } //開始連接服務端 private void startTheSocket() throws IOException{ toConnectTheServer();//創建Socket并初始化 openTheThreadToReceiveInfoFromServer();//開啟一個新的線程來接受服務端發來的信息 //一個循環,用于讀取鍵盤的輸入 while(true) { String yourMessage = scanner.nextLine(); //不為空則發送信息 if(yourMessage!=null) { writer.println(yourMessage); writer.flush();//記得flush清空緩沖區 } //判斷是否退出 if (yourMessage.equals("exit")) { disConnect(); System.exit(0); } } } //創建一個Socket來連接本機的18080端口的服務端并初始化reader和writer private void toConnectTheServer() throws IOException { socket=new Socket("127.0.0.1",18080); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true); } private void openTheThreadToReceiveInfoFromServer() throws IOException { new Thread(new Runnable() { @Override public void run() { try { printMessage();//打印從服務端收到的信息 } catch (IOException e) { e.printStackTrace(); } } }).start(); } //循環不斷讀取服務端的信息 private void printMessage() throws IOException { while (true) { String messageFromServer = null; try { messageFromServer = reader.readLine();//讀取信息 System.out.println("He say:" + messageFromServer);//打印信息 } catch (IOException e) { e.printStackTrace(); } catch (NullPointerException e) { } if(messageFromServer.equals("exit")){ disConnect();//關閉連接 System.exit(0); } } } //關閉各種 private void disConnect() throws IOException { socket.close(); reader.close(); writer.close(); } }
看完上述內容,你們對使用java如何實現解析Socket有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。