欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于Socket的解析以及雙方即時(shí)通訊的java實(shí)現(xiàn)方法

 更新時(shí)間:2017年03月07日 10:38:02   作者:Mezereon  
本篇文章主要介紹了關(guān)于Socket的解析以及雙方通訊的java實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。

在Java編程之中,我們通常都會(huì)接觸到網(wǎng)絡(luò)編程,那么不可避免地就會(huì)接觸到Socket通信,下面我將對(duì)Socket進(jìn)行簡(jiǎn)單的解析,并給出雙方通訊的代碼實(shí)現(xiàn)方案

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

首先服務(wù)端先創(chuàng)建一個(gè)SocketServer,那么創(chuàng)建一個(gè)SocketServer需要我們指定端口號(hào),如下

ServerSocket serverSocket=new ServerSocket(8888);

像上面這樣我們就簡(jiǎn)單的開了一個(gè)端口號(hào)為8888的ServerSocket了

接下來我們需要去接收來自客戶端的連接請(qǐng)求,也就是圖中的Other Socket,我們可以利用SockerServer的accept方法來建立連接,并且這個(gè)方法會(huì)返回一個(gè)Socket,用于和Other Socker進(jìn)行通信,簡(jiǎn)單來說,我們就是利用SockerServer來獲取Socket,然后利用這個(gè)Socket和別人通信

接下來我們獲取Socket的輸入輸出流,實(shí)現(xiàn)發(fā)送和接收信息,到此,我們已經(jīng)知道兩方進(jìn)行Socket通信的基本思路了

接下來我們來看看關(guān)于ServerSocket以及Socket的一些關(guān)鍵方法

ServerSocket

首先我們看一下ServerSocket的構(gòu)造方法,一共有4種:

1、無參的構(gòu)造方法 :

ServerSocket(), 返回沒有綁定端口號(hào)的ServerSocket實(shí)例
2、含一個(gè)參數(shù)的構(gòu)造方法 :

ServerSocket(int port),返回綁定給定端口號(hào)的ServerSocket實(shí)例

3、含兩個(gè)參數(shù)的構(gòu)造方法 :

ServerSocket(int port, int backlog),返回綁定給定端口號(hào)的ServerSocket實(shí)例,并且設(shè)定同步隊(duì)列(syns queue)的大小

4、含三個(gè)參數(shù)的構(gòu)造方法:

ServerSocket(int port, int backlog, InetAddress bindAddr),返回綁定給定端口號(hào)的ServerSocket實(shí)例,并且設(shè)定同步隊(duì)列(syns queue)的大小以及綁定給定的IP地址

主要看它的一些方法:

accept()

這個(gè)方法監(jiān)聽連接,一旦連接就返回一個(gè)Socket用于通信,需要注意的是,該方法為阻塞方法,如果沒有連接程序并不會(huì)繼續(xù)執(zhí)行下去

close()

關(guān)閉Socket,如果accept還在阻塞的話,就會(huì)拋出一個(gè)SocketException的異常

關(guān)于ServerSocket就不多加贅述了,我們來看一看Socket

Socket

構(gòu)造方法依然存在多種,這里只給出一個(gè)較為典型的

Socket(String host, int port),第一個(gè)參數(shù)是主機(jī)的IP地址作為字符串傳入,第二個(gè)參數(shù)為端口號(hào)

getInputStream(), getOutputStream()

獲得Socket的輸入輸出流,我們可以利用BufferReader以及PrintWriter來對(duì)這兩個(gè)流進(jìn)行操作,如下:

  BufferReader reader = new BufferedReader(
                  new InputStreamReader(socket.getInputStream()));
  PrintWriter writer = new PrintWriter(
                  new OutputStreamWriter(socket.getOutputStream()));

下面簡(jiǎn)單編寫一個(gè)雙方互相通信的java實(shí)現(xiàn)

首先是服務(wù)端

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);
 //開啟服務(wù)
 public void run() throws IOException {
     startTheSocket();
 }
 public void startTheSocket() throws IOException {
   serverSocket=new ServerSocket(18080); //打開18080端口等待連接
   acceptTheSocket();//接受連接并且初始化Socket,reader,writer
   openTheNewThreadToGetMessageFromClient();
   while(true) {   
      getYourMessage();//獲取鍵盤數(shù)據(jù)并作為輸入
   }
 }
 //接受連接并且初始化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());//打印端口號(hào)
   reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//獲得輸入流
   writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));//獲得輸出流
 }
 //掃描鍵盤并輸入數(shù)據(jù)
 private void getYourMessage() throws IOException {
   String yourMessage = scanner.nextLine();
   checkYourMessage(yourMessage);//檢查發(fā)送給客戶端的信息
   writer.println(yourMessage);//發(fā)送信息
   writer.flush();//flush方法用于清空緩沖區(qū),注意的是如果不flush你的信息可能發(fā)不出去一直存留在緩沖區(qū)
 }
 //用于檢查是否退出
 private void checkYourMessage(String yourMessage) throws IOException {
   //關(guān)閉各種
   if (yourMessage.equals("exit")) {
     socket.close();
     writer.close();
     reader.close();
     System.exit(0);
   }
 }
 //開啟一個(gè)新的線程來監(jiān)聽客戶端發(fā)來的信息
 private void openTheNewThreadToGetMessageFromClient() throws IOException {
   //開啟一個(gè)新的線程
   new Thread(new Runnable() {
     @Override
     public void run() {
       getTheMessageFromClient();
     }
   }).start();

 }
 //不斷循環(huán)來獲取客戶端發(fā)來的信息
 private void getTheMessageFromClient() {
   while(true) {
     String messageFromClient = null;
     try {
       messageFromClient = reader.readLine();
     } catch (IOException e) {
       e.printStackTrace();
     }
     printTheMessage(messageFromClient);//打印客戶端發(fā)來的信息
   }
 }
 //打印客戶端發(fā)來的信息
 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();
  }

  //開始連接服務(wù)端
  private void startTheSocket() throws IOException{
      toConnectTheServer();//創(chuàng)建Socket并初始化
      openTheThreadToReceiveInfoFromServer();//開啟一個(gè)新的線程來接受服務(wù)端發(fā)來的信息

      //一個(gè)循環(huán),用于讀取鍵盤的輸入
      while(true) {
        String yourMessage = scanner.nextLine();
        //不為空則發(fā)送信息
        if(yourMessage!=null) {
          writer.println(yourMessage);
          writer.flush();//記得flush清空緩沖區(qū)
        }
        //判斷是否退出
        if (yourMessage.equals("exit")) {
          disConnect();
          System.exit(0);
        }
      }
  }

  //創(chuàng)建一個(gè)Socket來連接本機(jī)的18080端口的服務(wù)端并初始化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();//打印從服務(wù)端收到的信息
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }).start();
  }

  //循環(huán)不斷讀取服務(wù)端的信息
  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();//關(guān)閉連接
        System.exit(0);
      }
    }
  }

  //關(guān)閉各種
  private void disConnect() throws IOException {
    socket.close();
    reader.close();
    writer.close();
  }

}

至此,關(guān)于Socket通信簡(jiǎn)單的介紹以及利用java進(jìn)行簡(jiǎn)單的通信的實(shí)現(xiàn)就結(jié)束了~

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java+MySQL實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)源碼

    Java+MySQL實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)源碼

    這篇文章主要為大家詳細(xì)介紹了Java+MySQL實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java8 HashMap的實(shí)現(xiàn)原理分析

    Java8 HashMap的實(shí)現(xiàn)原理分析

    Java8之后新增挺多新東西,接下來通過本文給大家介紹Java8 HashMap的實(shí)現(xiàn)原理分析,對(duì)java8 hashmap實(shí)現(xiàn)原理相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • 使用@CacheEvict?多參數(shù)如何匹配刪除

    使用@CacheEvict?多參數(shù)如何匹配刪除

    這篇文章主要介紹了使用@CacheEvict?多參數(shù)如何匹配刪除,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • springboot微服務(wù)項(xiàng)目集成html頁面的實(shí)現(xiàn)

    springboot微服務(wù)項(xiàng)目集成html頁面的實(shí)現(xiàn)

    本文主要介紹了springboot微服務(wù)項(xiàng)目集成html頁面的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Android開發(fā)中Socket通信的基本實(shí)現(xiàn)方法講解

    Android開發(fā)中Socket通信的基本實(shí)現(xiàn)方法講解

    這篇文章主要介紹了Android開發(fā)中Socket通信的基本實(shí)現(xiàn)方法講解,是安卓上移動(dòng)互聯(lián)網(wǎng)程序開發(fā)的基礎(chǔ),需要的朋友可以參考下
    2015-12-12
  • JVM雙親委派模型知識(shí)詳細(xì)總結(jié)

    JVM雙親委派模型知識(shí)詳細(xì)總結(jié)

    今天帶各位小伙伴學(xué)習(xí)Java虛擬機(jī)的相關(guān)知識(shí),文中對(duì)JVM雙親委派模型作了非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • MybatisPlus多表連接查詢的具體實(shí)現(xiàn)

    MybatisPlus多表連接查詢的具體實(shí)現(xiàn)

    MyBatis Plus是一款針對(duì)MyBatis框架的增強(qiáng)工具, 它提供了很多方便的方法來實(shí)現(xiàn)多表聯(lián)查,本文主要介紹了MybatisPlus多表連接查詢的具體實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • PowerJob的AliOssService工作流程源碼解讀

    PowerJob的AliOssService工作流程源碼解讀

    這篇文章主要介紹了PowerJob的AliOssServiceg工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • SpringBoot接口路徑重復(fù),啟動(dòng)服務(wù)器失敗的解決

    SpringBoot接口路徑重復(fù),啟動(dòng)服務(wù)器失敗的解決

    這篇文章主要介紹了SpringBoot接口路徑重復(fù),啟動(dòng)服務(wù)器失敗的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • @ConfigurationProperties在IDEA中出現(xiàn)紅色波浪線問題解決方法

    @ConfigurationProperties在IDEA中出現(xiàn)紅色波浪線問題解決方法

    本文介紹了在Springboot項(xiàng)目中,當(dāng)@ConfigurationProperties注解出現(xiàn)紅色波浪線時(shí)的解決方法,文中有詳細(xì)的解決方案供大家參考,需要的朋友可以參考下
    2024-09-09

最新評(píng)論