亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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ù)寫起~

今天來講下關(guān)于Socket通信的簡單應(yīng)用,關(guān)于什么是Socket以及一些網(wǎng)絡(luò)編程的基礎(chǔ),這里就不提了,只記錄最簡單易懂實用的東西。

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

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

1.建立服務(wù)端ServerSocket和客戶端Socket

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

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

4.關(guān)閉相對應(yīng)的資源

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

1.首先先來看下ServerSocket

類 ServerSocket

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

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

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

ServerSocket(int port, int backlog) 

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

bind(SocketAddress endpoint, int backlog) 

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

accept() 

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

getInetAddress() 

返回此服務(wù)器套接字的本地地址。

 close() 

關(guān)閉此套接字。

2.再來看下Socket

類 Socket  

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

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

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

Socket(InetAddress address, int port) 

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

getInetAddress() 

返回套接字連接的地址。

shutdownInput() 

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

shutdownOutput() 

禁用此套接字的輸出流。

close() 

關(guān)閉此套接字。

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

服務(wù)端Server.java

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

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

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

4.關(guān)閉相關(guān)資源

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

}

客戶端Client.java

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

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

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

4.關(guān)閉相關(guān)資源

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);
      
      //根據(jù)輸入輸出流和服務(wù)端連接
      OutputStream outputStream=socket.getOutputStream();//獲取一個輸出流,向服務(wù)端發(fā)送信息
      PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流
      printWriter.print("服務(wù)端你好,我是Balla_兔子");
      printWriter.flush();
      socket.shutdownOutput();//關(guān)閉輸出流
      
      InputStream inputStream=socket.getInputStream();//獲取一個輸入流,接收服務(wù)端的信息
      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("客戶端接收服務(wù)端發(fā)送信息:"+info);
      }
      
      //關(guān)閉相對應(yīng)的資源
      bufferedReader.close();
      inputStream.close();
      printWriter.close();
      outputStream.close();
      socket.close();
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

}

4、效果截圖:

服務(wù)端:

 

客戶端:

 

 以上代碼實現(xiàn)了單客戶端和服務(wù)端的連接,若要實現(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多線程處理類 用來處理服務(wù)端接收到的客戶端請求(處理Socket對象)
 */
public class SocketThread extends Thread {
  private Socket socket;

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

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

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

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

  }

}

服務(wù)端類:Server.java

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

public class Server {

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

      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);
      
      //根據(jù)輸入輸出流和服務(wù)端連接
      OutputStream outputStream=socket.getOutputStream();//獲取一個輸出流,向服務(wù)端發(fā)送信息
      PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流
      printWriter.print("服務(wù)端你好,我是客戶1");
      printWriter.flush();
      socket.shutdownOutput();//關(guān)閉輸出流
      
      InputStream inputStream=socket.getInputStream();//獲取一個輸入流,接收服務(wù)端的信息
      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("客戶端接收服務(wù)端發(fā)送信息:"+info);
      }
      
      //關(guān)閉相對應(yīng)的資源
      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);

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

相關(guān)文章

  • Java面試必備之AQS阻塞隊列和條件隊列

    Java面試必備之AQS阻塞隊列和條件隊列

    我們大概知道AQS就是一個框架,把很多功能都給實現(xiàn)了(比如入隊規(guī)則,喚醒節(jié)點中的線程等),我們?nèi)绻褂玫脑捴恍枰獙崿F(xiàn)其中的一些方法(比如tryAcquire等)就行了!這次主要說說AQS中阻塞隊列的的入隊規(guī)則還有條件變量,需要的朋友可以參考下
    2021-06-06
  • Spring @Transaction 注解執(zhí)行事務(wù)的流程

    Spring @Transaction 注解執(zhí)行事務(wù)的流程

    這篇文章主要介紹了Spring @Transaction 注解執(zhí)行事務(wù)的流程,Spring 是如何開啟事務(wù)的?又是如何進行提交事務(wù)和關(guān)閉事務(wù)的,本文給大家詳細介紹,需要的朋友可以參考下
    2021-06-06
  • Java的字節(jié)緩沖流與字符緩沖流解析

    Java的字節(jié)緩沖流與字符緩沖流解析

    這篇文章主要介紹了Java的字節(jié)緩沖流與字符緩沖流解析,Java 緩沖流是Java I/O庫中的一種流,用于提高讀寫數(shù)據(jù)的效率,它通過在內(nèi)存中創(chuàng)建緩沖區(qū)來減少與底層設(shè)備的直接交互次數(shù),從而減少了I/O操作的開銷,需要的朋友可以參考下
    2023-11-11
  • Java實現(xiàn)優(yōu)雅的參數(shù)校驗方法詳解

    Java實現(xiàn)優(yōu)雅的參數(shù)校驗方法詳解

    這篇文章主要為大家詳細介紹了Java語言如何實現(xiàn)優(yōu)雅的參數(shù)校驗,文中的示例代碼講解詳細,對我們學習Java有一定是幫助,需要的可以參考一下
    2022-06-06
  • java 音頻轉(zhuǎn)換wav格式標準音頻的操作

    java 音頻轉(zhuǎn)換wav格式標準音頻的操作

    這篇文章主要介紹了java 音頻轉(zhuǎn)換wav格式標準音頻的操作,主要是使用ffmpeg命令進行轉(zhuǎn)換,該工具類主要是為了將各類音頻轉(zhuǎn)為wav標準格式,其中可以調(diào)節(jié)采樣率、聲道數(shù)等指標,依賴maven環(huán)境,需要的朋友可以參考下
    2021-10-10
  • Quartz作業(yè)調(diào)度基本使用詳解

    Quartz作業(yè)調(diào)度基本使用詳解

    這篇文章主要為大家介紹了Quartz作業(yè)調(diào)度基本使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 2020Mac M1安裝jdk和IDEA的詳細方法

    2020Mac M1安裝jdk和IDEA的詳細方法

    這篇文章主要介紹了2020Mac M1安裝jdk和IDEA的詳細方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • java微信開發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證

    java微信開發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證

    這篇文章主要為大家詳細介紹了java微信開發(fā)API第二步,微信獲取以及保存接口調(diào)用憑證,感興趣的小伙伴們可以參考一下
    2016-06-06
  • java?IP歸屬地功能實現(xiàn)詳解

    java?IP歸屬地功能實現(xiàn)詳解

    前一陣子抖音和微博開始陸續(xù)上了IP歸屬地的功能,引起了眾多熱議,有大批在國外的老鐵們開始"原形畢露",被定位到國內(nèi)來,那么IP歸屬到底是怎么實現(xiàn)的呢?那么網(wǎng)紅們的歸屬地到底對不對呢
    2022-07-07
  • Java項目打包發(fā)布到maven私倉常見的幾種方式

    Java項目打包發(fā)布到maven私倉常見的幾種方式

    這篇文章主要介紹了項目打包發(fā)布到maven私倉常見的幾種方式,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03

最新評論