最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA實現(xiàn)基于Tcp協(xié)議的簡單Socket通信實例

 更新時間:2017年01月20日 14:33:40   作者:http://www.cnblogs.com/lichenwei/p/4069432.html  
本篇文章主要介紹了JAVA實現(xiàn)基于Tcp協(xié)議的簡單Socket通信實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

好久沒寫博客了,前段時間忙于做項目,耽誤了些時間,今天開始繼續(xù)寫起~

今天來講下關于Socket通信的簡單應用,關于什么是Socket以及一些網絡編程的基礎,這里就不提了,只記錄最簡單易懂實用的東西。

 1、首先先來看下基于TCP協(xié)議Socket服務端和客戶端的通信模型:

 Socket通信步驟:(簡單分為4步)

1.建立服務端ServerSocket和客戶端Socket

2.打開連接到Socket的輸出輸入流

3.按照協(xié)議進行讀寫操作

4.關閉相對應的資源

2、相關聯(lián)的API:

1.首先先來看下ServerSocket

類 ServerSocket

此類實現(xiàn)服務器套接字。服務器套接字等待請求通過網絡傳入。它基于該請求執(zhí)行某些操作,然后可能向請求者返回結果。

服務器套接字的實際工作由 SocketImpl 類的實例執(zhí)行。應用程序可以更改創(chuàng)建套接字實現(xiàn)的套接字工廠來配置它自身,從而創(chuàng)建適合本地防火墻的套接字。

一些重要的方法:(具體大家查看官方api吧)

ServerSocket(int port, int backlog) 

利用指定的 backlog 創(chuàng)建服務器套接字并將其綁定到指定的本地端口號。

bind(SocketAddress endpoint, int backlog) 

將 ServerSocket 綁定到特定地址(IP 地址和端口號)。

accept() 

偵聽并接受到此套接字的連接

getInetAddress() 

返回此服務器套接字的本地地址。

 close() 

關閉此套接字。

2.再來看下Socket

類 Socket  

此類實現(xiàn)客戶端套接字(也可以就叫“套接字”)。套接字是兩臺機器間通信的端點。

套接字的實際工作由 SocketImpl 類的實例執(zhí)行。應用程序通過更改創(chuàng)建套接字實現(xiàn)的套接字工廠可以配置它自身,以創(chuàng)建適合本地防火墻的套接字。

一些重要的方法:(具體大家查看官方api吧)

Socket(InetAddress address, int port) 

創(chuàng)建一個流套接字并將其連接到指定 IP 地址的指定端口號。

getInetAddress() 

返回套接字連接的地址。

shutdownInput() 

此套接字的輸入流置于“流的末尾”。

shutdownOutput() 

禁用此套接字的輸出流。

close() 

關閉此套接字。

 3、代碼實現(xiàn):(注釋很全,這里就不詳細多說了)

服務端Server.java

1.創(chuàng)建ServerSocket對象,綁定并監(jiān)聽端口

2.通過accept監(jiān)聽客戶端的請求

3.建立連接后,通過輸出輸入流進行讀寫操作

4.關閉相關資源

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {

  /**
   * Socket服務端
   */
  public static void main(String[] args) {
    try {
      ServerSocket serverSocket=new ServerSocket(8888);
      System.out.println("服務端已啟動,等待客戶端連接..");
      Socket socket=serverSocket.accept();//偵聽并接受到此套接字的連接,返回一個Socket對象
      
      
      //根據輸入輸出流和客戶端連接
      InputStream inputStream=socket.getInputStream();//得到一個輸入流,接收客戶端傳遞的信息
      InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//提高效率,將自己字節(jié)流轉為字符流
      BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//加入緩沖區(qū)
      String temp=null;
      String info="";
      while((temp=bufferedReader.readLine())!=null){
        info+=temp;
        System.out.println("已接收到客戶端連接");
        System.out.println("服務端接收到客戶端信息:"+info+",當前客戶端ip為:"+socket.getInetAddress().getHostAddress());
      }
      
      OutputStream outputStream=socket.getOutputStream();//獲取一個輸出流,向服務端發(fā)送信息
      PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流
      printWriter.print("你好,服務端已接收到您的信息");
      printWriter.flush();
      socket.shutdownOutput();//關閉輸出流
      
      
      
      //關閉相對應的資源
      printWriter.close();
      outputStream.close();
      bufferedReader.close();
      inputStream.close();
      socket.close();
      
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

客戶端Client.java

1.創(chuàng)建Socket對象,指定服務端的地址和端口號

2.建立連接后,通過輸出輸入流進行讀寫操作

3.通過輸出輸入流獲取服務器返回信息

4.關閉相關資源

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {

  /**
   * Socket客戶端
   */
  public static void main(String[] args) {
    try {
      //創(chuàng)建Socket對象
      Socket socket=new Socket("localhost",8888);
      
      //根據輸入輸出流和服務端連接
      OutputStream outputStream=socket.getOutputStream();//獲取一個輸出流,向服務端發(fā)送信息
      PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流
      printWriter.print("服務端你好,我是Balla_兔子");
      printWriter.flush();
      socket.shutdownOutput();//關閉輸出流
      
      InputStream inputStream=socket.getInputStream();//獲取一個輸入流,接收服務端的信息
      InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//包裝成字符流,提高效率
      BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//緩沖區(qū)
      String info="";
      String temp=null;//臨時變量
      while((temp=bufferedReader.readLine())!=null){
        info+=temp;
        System.out.println("客戶端接收服務端發(fā)送信息:"+info);
      }
      
      //關閉相對應的資源
      bufferedReader.close();
      inputStream.close();
      printWriter.close();
      outputStream.close();
      socket.close();
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

}

4、效果截圖:

服務端:

 

客戶端:

 

 以上代碼實現(xiàn)了單客戶端和服務端的連接,若要實現(xiàn)多客戶端操作,需要涉及到多線程,只要你把每個接收到的Socket對象單獨開一條線程操作,然后用一個死循環(huán)while(true)去監(jiān)聽端口就行,這邊直接給代碼了

線程操作類:SocketThread.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * Socket多線程處理類 用來處理服務端接收到的客戶端請求(處理Socket對象)
 */
public class SocketThread extends Thread {
  private Socket socket;

  public SocketThread(Socket socket) {
    this.socket = socket;
  }

  public void run() {
    // 根據輸入輸出流和客戶端連接
    try {
      InputStream inputStream = socket.getInputStream();
      // 得到一個輸入流,接收客戶端傳遞的信息
      InputStreamReader inputStreamReader = new InputStreamReader(
          inputStream);// 提高效率,將自己字節(jié)流轉為字符流
      BufferedReader bufferedReader = new BufferedReader(
          inputStreamReader);// 加入緩沖區(qū)
      String temp = null;
      String info = "";
      while ((temp = bufferedReader.readLine()) != null) {
        info += temp;
        System.out.println("已接收到客戶端連接");
        System.out.println("服務端接收到客戶端信息:" + info + ",當前客戶端ip為:"
            + socket.getInetAddress().getHostAddress());
      }

      OutputStream outputStream = socket.getOutputStream();// 獲取一個輸出流,向服務端發(fā)送信息
      PrintWriter printWriter = new PrintWriter(outputStream);// 將輸出流包裝成打印流
      printWriter.print("你好,服務端已接收到您的信息");
      printWriter.flush();
      socket.shutdownOutput();// 關閉輸出流

      // 關閉相對應的資源
      bufferedReader.close();
      inputStream.close();
      printWriter.close();
      outputStream.close();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

}

服務端類:Server.java

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

  /**
   * Socket服務端
   */
  public static void main(String[] args) {
    try {
      ServerSocket serverSocket = new ServerSocket(8888);
      System.out.println("服務端已啟動,等待客戶端連接..");

      while (true) {
        Socket socket = serverSocket.accept();// 偵聽并接受到此套接字的連接,返回一個Socket對象
        SocketThread socketThread = new SocketThread(socket);
        socketThread.start();
      }

    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

客戶端類:Client.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {

  /**
   * Socket客戶端
   */
  public static void main(String[] args) {
    try {
      //創(chuàng)建Socket對象
      Socket socket=new Socket("localhost",8888);
      
      //根據輸入輸出流和服務端連接
      OutputStream outputStream=socket.getOutputStream();//獲取一個輸出流,向服務端發(fā)送信息
      PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流
      printWriter.print("服務端你好,我是客戶1");
      printWriter.flush();
      socket.shutdownOutput();//關閉輸出流
      
      InputStream inputStream=socket.getInputStream();//獲取一個輸入流,接收服務端的信息
      InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//包裝成字符流,提高效率
      BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//緩沖區(qū)
      String info="";
      String temp=null;//臨時變量
      while((temp=bufferedReader.readLine())!=null){
        info+=temp;
        System.out.println("客戶端接收服務端發(fā)送信息:"+info);
      }
      
      //關閉相對應的資源
      bufferedReader.close();
      inputStream.close();
      printWriter.close();
      outputStream.close();
      socket.close();
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

}

看下效果實現(xiàn)圖:

 

這里只是拋磚引玉,在實際開發(fā)中,基于Socket編程,一般傳遞的并非字符串,很多情況下是對象,我們可以使用ObjectOutputStream將輸出流對象序列化。

例如:

 OutputStream outputStream = socket.getOutputStream();
 ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
 User user=new User("admin","123456");
 objectOutputStream.writeObject(user);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 關于JAVA11中圖片與BASE64相互轉換的實現(xiàn)

    關于JAVA11中圖片與BASE64相互轉換的實現(xiàn)

    這篇文章主要介紹了關于JAVA11中圖片與BASE64相互轉換的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • request如何獲取body的json數據

    request如何獲取body的json數據

    這篇文章主要介紹了request如何獲取body的json數據操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java異常 Factory method''sqlSessionFactory''rew exception;ested exception is java.lang.NoSuchMethodError:

    Java異常 Factory method''sqlSessionFactory''rew exception;este

    這篇文章主要介紹了Java異常 Factory method ‘sqlSessionFactory‘ threw exception; nested exception is java.lang.NoSuchMethodError:,本文介紹了springboot 引入mybatis-plus后報錯的解決方案,以下就是詳細內容,需要的朋友可以參考下
    2021-07-07
  • Java中for、foreach、stream區(qū)別和性能比較詳解

    Java中for、foreach、stream區(qū)別和性能比較詳解

    for、foreach、stream都可以循環(huán)處理數據,如果單純當循環(huán)使用,for、foreach、stream哪個性能更好,這篇文章主要給大家介紹了關于Java中for、foreach、stream區(qū)別和性能的相關資料,需要的朋友可以參考下
    2024-03-03
  • springboot 傳參校驗@Valid及對其的異常捕獲方式

    springboot 傳參校驗@Valid及對其的異常捕獲方式

    這篇文章主要介紹了springboot 傳參校驗@Valid及對其的異常捕獲方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring Security 表單登錄功能的實現(xiàn)方法

    Spring Security 表單登錄功能的實現(xiàn)方法

    這篇文章主要介紹了Spring Security 表單登錄,本文將構建在之前簡單的 Spring MVC示例 之上,因為這是設置Web應用程序和登錄機制的必不可少的。需要的朋友可以參考下
    2019-06-06
  • springboot接收json數據時,接收到空值問題

    springboot接收json數據時,接收到空值問題

    這篇文章主要介紹了springboot接收json數據時,接收到空值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java實現(xiàn)左旋轉字符串

    java實現(xiàn)左旋轉字符串

    這篇文章主要為大家詳細介紹了java實現(xiàn)左旋轉字符串,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • 一文理解kafka?rebalance負載均衡

    一文理解kafka?rebalance負載均衡

    這篇文章主要為大家介紹了kafka?rebalance負載均衡的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • SpringBoot Tomcat啟動實例代碼詳解

    SpringBoot Tomcat啟動實例代碼詳解

    這篇文章主要介紹了SpringBoot Tomcat啟動實例代碼詳解,需要的朋友可以參考下
    2017-09-09

最新評論

白银市| 罗江县| 靖安县| 皋兰县| 淮安市| 凌云县| 静宁县| 怀安县| 营口市| 洛南县| 德化县| 杭州市| 化州市| 雷山县| 弋阳县| 濉溪县| 威远县| 沾化县| 邻水| 衢州市| 华坪县| 扬中市| 江陵县| 梅河口市| 广州市| 龙海市| 武城县| 儋州市| 曲阜市| 额敏县| 溆浦县| 依安县| 铁力市| 嘉荫县| 万荣县| 尚义县| 巴中市| 肇源县| 平陆县| 于都县| 元江|