實現socket的服務和客戶端通訊

對學習過程當中本身敲的一些關於socket有關的代碼作了個簡單總結,在這分享一下,給有須要的同窗借鑑一下。java

什麼是socket?程序員

網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket。
創建網絡通訊鏈接至少要一對端口號(socket)。socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員作網絡開發所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通訊的能力。
Socket的英文原義是「孔」或「插座」。做爲BSD UNIX的進程通訊機制,取後一種意思。一般也稱做"套接字",用於描述IP地址和端口,是一個通訊鏈的句柄,能夠用來實現不一樣虛擬機或不一樣計算機之間的通訊。在Internet上的主機通常運行了多個服務軟件,同時提供幾種服務。每種服務都打開一個Socket,並綁定到一個端口上,不一樣的端口對應於不一樣的服務。Socket正如其英文原義那樣,像一個多孔插座。一臺主機猶如佈滿各類插座的房間,每一個插座有一個編號,有的插座提供220伏交流電, 有的提供110伏交流電,有的則提供有線電視節目。 客戶軟件將插頭插到不一樣編號的插座,就能夠獲得不一樣的服務。
Java就給咱們提供了socket,咱們只要會使用就能夠了,接下來爲你們介紹一個簡單的socket小例子,完成socket服務和客戶端間的通訊。
這是咱們socket小例子的一個簡單架構,由服務端、客戶端、線程工做業務邏輯、數據獲取類組成。

 

首先咱們先來完成socket服務端的代碼開發。編程

在服務端的main方法裏,咱們將socketserver對象設置成持久的,並綁定於本機的8899端口上,去接收客戶端的socket鏈接。服務器

package com.wenbing.socket;

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ServerSocket;
import java.net.Socket;

public class ServiceServer {

    public static void main(String[] args) throws Exception{
//        建立一個serversocket,綁定到本機的8899端口上
        ServerSocket server = new ServerSocket();
        server.bind(new InetSocketAddress("localhost", 8899));

//        接收客戶端的鏈接;accept是一個阻塞方法,會一直等待,到有客戶端請求鏈接才返回
        while (true) {
            Socket socket = server.accept();
//            每一個socket請求都給一個線程來處理
            new Thread(new ServiceServerTask(socket)).start();

        }

    }

}

 

 咱們定義一個服務端處理客戶端請求過來的數據處理線程工做類,讓每一個請求來的socket都由每個線程去執行業務邏輯,ServiceServerTask類實行Runnable接口。
package com.wenbing.socket;

import java.io.*;
import java.net.Socket;

public class ServiceServerTask implements Runnable {

    Socket socket;
    InputStream inputStream = null;
    OutputStream outputStream = null;

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

    //    業務邏輯,跟客戶端進行數據交互
    @Override
    public void run() {

        try {
//            從socket鏈接中獲取到與client之間的網絡通訊輸入流
            inputStream = socket.getInputStream();
//            從socket鏈接中獲取到與client之間的網絡通訊輸出流
            outputStream = socket.getOutputStream();

//            BufferedReader讀取數據是一個字符一個字符讀取,遇到回車即中止
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
//            從網絡通訊輸入流中讀取客戶端發送過來的數據,讀取一行,遇到回車即結束
            // 注意:socketinputstream的讀數據的方法是阻塞的
            //讀取不少行數據,用while循環讀
//            String line = "";
//            String param = "";
//            while (( line = br.readLine()) != null) {
//                param = br.readLine();
//                System.out.println(param);
//            }
            String param = br.readLine();

            System.out.println(param);
            GetDataServiceImpl getDataService = new GetDataServiceImpl();
            String result = getDataService.getData(param);

//            將調用結果寫到socket的輸出流中,以發送給客戶端
            PrintWriter printWriter = new PrintWriter(outputStream);
            printWriter.println(result);
            printWriter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
//                關流,如今是在每一個線程裏
                inputStream.close();
                outputStream.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}

處理數據的方法。網絡

package com.wenbing.socket;

public class GetDataServiceImpl {

    public String getData(String param) {
        return "OK-" + param;
    }

}

接下來就是socket客戶端了。客戶端和服務端代碼基本相同。架構

package com.wenbing.socket;

import java.io.*;
import java.net.Socket;

public class ServiceClient {

    public static void main(String[] args) throws Exception {
//        向服務器發出請求創建鏈接
        Socket socket = new Socket("localhost", 8899);
//        從socket中獲取輸出流
        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();

        PrintWriter printWriter = new PrintWriter(outputStream);
        printWriter.println("hello");
        printWriter.flush();

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String result = bufferedReader.readLine();
        System.out.println(result);

        inputStream.close();
        outputStream.close();
        socket.close();
    }

}

簡單的socket小例子,送給java小白們。socket

紙上得來終覺淺,絕知此事要躬行,必定要跟着敲一敲才更容易理解哦。ide

相關文章
相關標籤/搜索