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

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

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

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

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

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

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

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

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

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

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

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

1.首先先來看下ServerSocket

類 ServerSocket

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

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

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

ServerSocket(int port, int backlog) 

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

bind(SocketAddress endpoint, int backlog) 

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

accept() 

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

getInetAddress() 

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

 close() 

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

2.再來看下Socket

類 Socket  

此類實(shí)現(xiàn)客戶端套接字(也可以就叫“套接字”)。套接字是兩臺(tái)機(jī)器間通信的端點(diǎn)。

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

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

Socket(InetAddress address, int port) 

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

getInetAddress() 

返回套接字連接的地址。

shutdownInput() 

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

shutdownOutput() 

禁用此套接字的輸出流。

close() 

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

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

服務(wù)端Server.java

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

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

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

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ù)端已啟動(dòng),等待客戶端連接..");
      Socket socket=serverSocket.accept();//偵聽并接受到此套接字的連接,返回一個(gè)Socket對(duì)象
      
      
      //根據(jù)輸入輸出流和客戶端連接
      InputStream inputStream=socket.getInputStream();//得到一個(gè)輸入流,接收客戶端傳遞的信息
      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+",當(dāng)前客戶端ip為:"+socket.getInetAddress().getHostAddress());
      }
      
      OutputStream outputStream=socket.getOutputStream();//獲取一個(gè)輸出流,向服務(wù)端發(fā)送信息
      PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流
      printWriter.print("你好,服務(wù)端已接收到您的信息");
      printWriter.flush();
      socket.shutdownOutput();//關(guān)閉輸出流
      
      
      
      //關(guān)閉相對(duì)應(yīng)的資源
      printWriter.close();
      outputStream.close();
      bufferedReader.close();
      inputStream.close();
      socket.close();
      
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

}

客戶端Client.java

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

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

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對(duì)象
      Socket socket=new Socket("localhost",8888);
      
      //根據(jù)輸入輸出流和服務(wù)端連接
      OutputStream outputStream=socket.getOutputStream();//獲取一個(gè)輸出流,向服務(wù)端發(fā)送信息
      PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流
      printWriter.print("服務(wù)端你好,我是Balla_兔子");
      printWriter.flush();
      socket.shutdownOutput();//關(guān)閉輸出流
      
      InputStream inputStream=socket.getInputStream();//獲取一個(gè)輸入流,接收服務(wù)端的信息
      InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//包裝成字符流,提高效率
      BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//緩沖區(qū)
      String info="";
      String temp=null;//臨時(shí)變量
      while((temp=bufferedReader.readLine())!=null){
        info+=temp;
        System.out.println("客戶端接收服務(wù)端發(fā)送信息:"+info);
      }
      
      //關(guān)閉相對(duì)應(yīng)的資源
      bufferedReader.close();
      inputStream.close();
      printWriter.close();
      outputStream.close();
      socket.close();
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

}

4、效果截圖:

服務(wù)端:

 

客戶端:

 

 以上代碼實(shí)現(xiàn)了單客戶端和服務(wù)端的連接,若要實(shí)現(xiàn)多客戶端操作,需要涉及到多線程,只要你把每個(gè)接收到的Socket對(duì)象單獨(dú)開一條線程操作,然后用一個(gè)死循環(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ù)端接收到的客戶端請(qǐng)求(處理Socket對(duì)象)
 */
public class SocketThread extends Thread {
  private Socket socket;

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

  public void run() {
    // 根據(jù)輸入輸出流和客戶端連接
    try {
      InputStream inputStream = socket.getInputStream();
      // 得到一個(gè)輸入流,接收客戶端傳遞的信息
      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 + ",當(dāng)前客戶端ip為:"
            + socket.getInetAddress().getHostAddress());
      }

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

      // 關(guān)閉相對(duì)應(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ù)端已啟動(dòng),等待客戶端連接..");

      while (true) {
        Socket socket = serverSocket.accept();// 偵聽并接受到此套接字的連接,返回一個(gè)Socket對(duì)象
        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對(duì)象
      Socket socket=new Socket("localhost",8888);
      
      //根據(jù)輸入輸出流和服務(wù)端連接
      OutputStream outputStream=socket.getOutputStream();//獲取一個(gè)輸出流,向服務(wù)端發(fā)送信息
      PrintWriter printWriter=new PrintWriter(outputStream);//將輸出流包裝成打印流
      printWriter.print("服務(wù)端你好,我是客戶1");
      printWriter.flush();
      socket.shutdownOutput();//關(guān)閉輸出流
      
      InputStream inputStream=socket.getInputStream();//獲取一個(gè)輸入流,接收服務(wù)端的信息
      InputStreamReader inputStreamReader=new InputStreamReader(inputStream);//包裝成字符流,提高效率
      BufferedReader bufferedReader=new BufferedReader(inputStreamReader);//緩沖區(qū)
      String info="";
      String temp=null;//臨時(shí)變量
      while((temp=bufferedReader.readLine())!=null){
        info+=temp;
        System.out.println("客戶端接收服務(wù)端發(fā)送信息:"+info);
      }
      
      //關(guān)閉相對(duì)應(yīng)的資源
      bufferedReader.close();
      inputStream.close();
      printWriter.close();
      outputStream.close();
      socket.close();
    } catch (UnknownHostException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }

  }

}

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

 

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

例如:

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

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

相關(guān)文章

  • Java面試必備之AQS阻塞隊(duì)列和條件隊(duì)列

    Java面試必備之AQS阻塞隊(duì)列和條件隊(duì)列

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

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

    這篇文章主要介紹了Spring @Transaction 注解執(zhí)行事務(wù)的流程,Spring 是如何開啟事務(wù)的?又是如何進(jìn)行提交事務(wù)和關(guān)閉事務(wù)的,本文給大家詳細(xì)介紹,需要的朋友可以參考下
    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實(shí)現(xiàn)優(yōu)雅的參數(shù)校驗(yàn)方法詳解

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

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

    java 音頻轉(zhuǎn)換wav格式標(biāo)準(zhǔn)音頻的操作

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

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

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

    2020Mac M1安裝jdk和IDEA的詳細(xì)方法

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

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

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

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

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

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

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

最新評(píng)論