1. 程式人生 > >基於java的socket程式設計

基於java的socket程式設計

socket程式設計:

一:什麼是socket:socket是BSD UNIX的通訊機制,通常稱為“套接字”,其英文原意是“孔”或“插座”。有些顧名思義,socket正如其英文原意一樣,像是一個多孔插座,可以提供多個埠的連線服務。

為了更加直觀的瞭解socket,可以用插座來比喻socket。

如果說socket是一個多孔插座,插座是提供各種電器供電的地方,不同的電器工作時需要的電壓和電流也不一樣,但各種電器都有各自的一個插口,這個稱之為“埠”。電器使用的電可以看做是網路資源或者是各種“流”,電是由電線傳輸過來的,所以插座需要連線電線,這裡電線也就是伺服器和客戶端連線 “connection”。 其中初始化socket的過程像是買來一個插座的安裝過程。

在插座這邊的是“客戶端”,電線那邊提供電的發電廠是“伺服器”。客戶端和發電廠都各自擁有一個地址,即“IP地址”。其中還有一套傳輸和用電的規則,比如傳輸電時需要的電線多少伏才能滿足需求,電器用電的技術引數,埠是幾個孔的。這個是“協議”。正常情況下我們是不會去管協議的內容是什麼,也就是說協議在我們面前是隱藏的。

在這裡插入圖片描述
二.工作原理:對於伺服器來說,伺服器先初始化socket,然後埠繫結(bind),再對埠監聽(listen),呼叫accept阻塞,等待客戶端連線請求。對於客戶端來說,客戶端初始化socket,然後申請連線(connection)。客戶端申請連線,伺服器接受申請並且回覆申請許可(這裡要涉及TCP三次握手連線),然後傳送資料,最後關閉連線,這是一次互動過程。
在這裡插入圖片描述


客戶端Client原始碼如下:

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

public class Client {

    public static void main(String[] args) throws Exception {
        // TODO 自動生成的方法存根
        
        String readline = null;
        String inTemp = null;
        //String outTemp = null;
        String turnLine = "\n";
        final
String client = "Client:"; final String server = "Server:"; int port = 4000; byte ipAddressTemp[] = {127, 0, 0, 1}; InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp); //首先直接建立socket,埠號1~1023為系統儲存,一般設在1023之外 Socket socket = new Socket(ipAddress, port); //建立三個流,系統輸入流BufferedReader systemIn,socket輸入流BufferedReader socketIn,socket輸出流PrintWriter socketOut; BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in)); BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter socketOut = new PrintWriter(socket.getOutputStream()); while(readline != "bye"){ System.out.println(client); readline = systemIn.readLine(); //System.out.println(readline); socketOut.println(readline); socketOut.flush(); //趕快重新整理使Server收到,也可以換成socketOut.println(readline, ture) //outTemp = readline; inTemp = socketIn.readLine(); //System.out.println(client + outTemp); System.out.println(server + turnLine + inTemp); } systemIn.close(); socketIn.close(); socketOut.close(); socket.close(); } }

伺服器Server原始碼如下:


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


public class Server {

    public static void main(String[] args) throws Exception {
        // TODO 自動生成的方法存根
        
        String readline = null;
        String inTemp = null;
        //String outTemp = null;
        String turnLine = "\n";
        final String client = "Client:";
        final String server = "Server:";
        
        int port = 4000;
        //byte ipAddressTemp[] = {127, 0, 0, 1};
        //InetAddress ipAddress = InetAddress.getByAddress(ipAddressTemp);
        
        //首先直接建立serversocket
        ServerSocket serverSocket = new ServerSocket(port);  
        
     //呼叫伺服器的accept()進行阻塞(程式會在這等待),當有申請連線時會開啟阻塞並返回一個socket
        Socket socket = serverSocket.accept();
        
        //建立三個流,系統輸入流BufferedReader systemIn,socket輸入流BufferedReader socketIn,socket輸出流PrintWriter socketOut;
        BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
        
        while(readline != "bye"){
            
            inTemp = socketIn.readLine();
            System.out.println(client + turnLine + inTemp);
            System.out.println(server);
            
            readline = systemIn.readLine();
            
            socketOut.println(readline);
            socketOut.flush();    //趕快重新整理使Client收到,也可以換成socketOut.println(readline, ture)
            
            //outTemp = readline;
            
            //System.out.println(server);
            
        }
        
        systemIn.close();
        socketIn.close();
        socketOut.close();
        socket.close();
        serverSocket.close();
        
    }

}

在這裡插入圖片描述