中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用java如何實現解析Socket

發布時間:2020-11-11 16:27:39 來源:億速云 閱讀:147 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關使用java如何實現解析Socket,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

在Java編程之中,我們通常都會接觸到網絡編程,那么不可避免地就會接觸到Socket通信,下面我將對Socket進行簡單的解析,并給出雙方通訊的代碼實現方案

首先我們來介紹一下整個Socket的通信過程

使用java如何實現解析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有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河北区| 开阳县| 专栏| 儋州市| 沙雅县| 松江区| 嘉祥县| 西林县| 萨嘎县| 施秉县| 平利县| 岑巩县| 富民县| 将乐县| 台山市| 温泉县| 夏邑县| 丰台区| 靖西县| 鄂伦春自治旗| 柞水县| 万年县| 耿马| 保康县| 新营市| 内乡县| 中江县| 舟曲县| 盘锦市| 神农架林区| 柳江县| 清原| 望江县| 绥宁县| 阳江市| 昂仁县| 河池市| 丹江口市| 星子县| 扬中市| 衢州市|