當前位置 : IT培訓網 > Java開發 > Java教程 > Java編程開發之套接字(Socket)

Java編程開發之套接字(Socket)

時間:2016-09-06 16:05:43??來源:Java培訓網??作者:IT培訓網??已有:名學員訪問該課程
www(萬維網)就是建立在客戶機/服務器模式上,以HTML語言和HTTP協議為基礎,能夠提供各種Internet服務的信息瀏覽系統。網絡信息放在主機的不同位置,www服務器利用超文本鏈路鏈接各項信息。www客戶機(瀏覽器Brower)負責與服務器

什么是套接字(Socket)

套接字,是支持TCP/IP的網絡通信的基本操作單元,可以看做是不同主機之間的進程進行雙向通信的端點,簡單的說就是通信的兩方的一種約定,用套接字中的相關函數來完成通信過程。

非常非常簡單的舉例說明下:Socket=Ip address+ TCP/UDP + port。

源IP地址和目的IP地址以及源端口號和目的端口號的組合稱為套接字。其用于標識客戶端請求的服務器和服務。

它是網絡通信過程中端點的抽象表示,包含進行網絡通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。

網絡應用模式主要有:

主機/終端模式:集中計算,集中管理;

客戶機/服務器(Client/Server,簡稱C/S)模式:分布計算,分布管理;

瀏覽器/服務器模式:利用Internet跨平臺。

www(萬維網)就是建立在客戶機/服務器模式上,以HTML語言和HTTP協議為基礎,能夠提供各種Internet服務的信息瀏覽系統。網絡信息放在主機的不同位置,www服務器利用超文本鏈路鏈接各項信息。www客戶機(瀏覽器Brower)負責與服務器建立聯系,向服務器發送請求,處理HTML超媒體,提供圖形用戶界面(GUI),顯示信息等。

在客戶機/服務器工作模式中,在Server端,要準備接受多個Client端計算機的通信。為此,除用IP地址標識Internet上的計算機之外,另還引入端口號,用端口號標識正在Server端后臺服務的線程。端口號與IP地址的組合稱為網絡套接字(socket)。

Java語言在實現C/S模式中,套接字分為兩類:

在Server端,ServerSocket類支持底層的網絡通信;

在Client端,Socket類支持網絡的底層通信。

Server機通過端口(總線I/O地址)提供面向Client機的服務;Server機在它的幾個不同端口分別同時提供幾種不同的服務。Client接入Server的某一端口,通過這個端口提請Server機為其服務。規定:端口號0~1023供系統專用。例如,HTTP協議在端口80,telnet協議在端口23。端口1024~65535供應用程序使用。

當Client程序和Server程序需要通信時,可以用Socket類建立套接字連接。套接字連接可想象為一個電話呼叫:最初是Client程序建立呼叫,Server程序監聽;呼叫完成后,任何一方都可以隨時講話。

雙方實現通信有流式socket和數據報式socket兩種可選方式:

流式socket是有連接的通信,即TCP(Transmission Control Protocol):每次通信前建立連接,通信結束后斷開連接。特點是可以保證傳輸的正確性、可靠性。

數據報式socket是無連接的通信,即UDP(User Datagram Protocol):將欲傳輸的數據分成 小包,直接上網發送。無需建立連接和拆除連接,速度快,但無可靠保證。

流式socket在Client程序和Server程序間建立通信的通道。每個socket可以進行讀和寫兩種操作。對于任一端,與對方的通信會話過程是:

建立socket連接,獲得輸入/輸出流,讀數據/寫數據,通信完成后關閉socket(拆除連接)。流式Socket的通信過程見【例 13-1】。

利用socket的構造方法,可以在客戶端建立到服務器的套接字對象:

Socket(String host,int port):host是服務器的IP地址,port是端口號,這些是預先約定的。

例如,代碼:

try{

Socket mySocket = new Socket(“http://www.straightshotcamera.com” ,1860);

}catch(IOException e){}

然后,用getInputStream()方法獲得輸入流,用這個輸入流讀取服務器放入“線路”的信息;用getOutputStream()方法獲得輸出流,用這個輸出流將信息寫入“線路”。

利用ServerSocket的構造方法可以在服務器建立接受客戶套接字的服務器套接字對象:

ServerSocket(int port):指定端口號,創建一個ServerSocket對象。端口號port要與客戶呼叫的端口號相同。為此,用以下形式代碼:

try{

ServerSocket serverSocket = new ServerSocket(1860);

}catch(IOException e){}

服務器端程序在指定的端口監聽,當收到Client程序發出的服務請求時,創建一個套接字對象與該端口對應的Client程序通信。例如,執行上述建立服務器套接字對象的代碼,確立了對象serverSocket后,就可能它使用accept()方法,得到Socket對象,接收Client程序來自套接字mySocket的信息。如以下代碼所示:

try{

Socket sc = serverSocket.accept();//ac是一個Socket對象

}catch(IOException e){}

要撤銷服務,可以關閉Socket對象sc:

sc.close();

【例 13-3】C/S模式中的Client端應用程序。這是一個Client端的流式Socket通信的簡單實例,代碼說明Client端程序的編寫方法。例中,Client程序向服務器主機的端口4441提出請求,連接建立后完成對服務器的讀寫(查看源文件)。

import java.io.*;

import java.net.*;

public class Client{

    public static void main(String args[]){

        String s = null;Socket mySocket;

        DataInputStream in = null;DataOutputStream out = null;

        try{

            mySocket = new Socket(“localhost”,4441);

            in = new DataInputStream(mySocket.getInputStream());

            out = new DataOutputStream(mySocket.getOutputStream());

            out.writeUTF(“good server!”);

            while(true){

                s = in.readUTF();

                if(s==null) break;

                else System.out.println(s);

            }

            mySocket.close();

        }catch(IOException e){

            System.out.println(“can’t connect”);

        }

    }

}

【例 13-4】與例10.3 Client端應用程序對應的Server端應用程序。程序在4441端口監聽,當檢測到有客戶機請求時,產生一個內為“客戶,你好,我是服務器”的字符串輸出到客戶端(查看源文件)。

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

public class Server{

    public static void main(String args[]){

        ServerSocket server = null;

        Socket you = null;String s = null;

        DataOutputStream out = null;

        DataInputStream in = null;

        try{

            server = new ServerSocket(4441);

        }catch(IOException e1){

            system.out.println(“ERROR:” +e1);

        }

        try{

            you = server.accept();

            in = new DataInputStream(you.getInputStream());

            out = new DataOutputStream(you. getOutputStream());

            while(true){

                s = in.readUTF();

                if(s!=null) break;

            }

            out.writeUTF(“客戶,你好,我是服務器”);

            out.close();

        }

        catch(IOException e){System.out.println(“ERROR:”+e);}

    }

}

為了充分發揮計算機的平行工作能力,可以把套接字連接工作讓一個線程完成。當客戶端要請求服務器給予服務,或當服務器端接收到一個客戶的服務請求,就啟動一個專門完成信息通信的線程,在該線程中創建輸入輸出流,并完成客戶端與服務器端的信息交流。

【例 13-5】 將套接字連接工作置于線程的客戶端小應用程序。界面在有一個發送信息按紐、一個文本框和一個文本區。客戶端應用程序首先與服務器建立套接字連接。使用數據輸入流in反復讀取服務器放入線路里的信息,將收到的信息在文本區中顯示。婐志取的信息是“結束”,則關閉套接字連接,并結束程序。用戶也可在文本框輸入信息,并按發送信息按鈕,則客戶端程序利用數據輸出流out,將文本框中的內容發送給服務器。

import java.net.*;

import java.io.*;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import java.applet.*;

public class Aclient extends Applet implements Runnable,ActionListener{

    JButton button; JTextField textF; JTextArea textA;

    Socket socket; Thread thread;

    DataInputStream in; DataOutputStream out;

    public void init(){

        setBackground(new Color(120,153,137));

        setLayout(new BorderLayout());

        Button = new JButton(“發送信息”);

        textF = new JTextField(20);

        textA = new JTextArea(20,30);

        setSize(450,350);

        JPanel p = new JPanel();

        p.add(textF); p.add(button);

        add(textA,”Center”); add(p,”South”);

        button.addActionListener(this);

    }

    public void start(){

        try{

            socket = new Socket(this.getCodeBase().getHost(),4441);

            in = new DataInputStream(socket.getInputStream());

            out = new DataOutputStream(socket.getOutputStream());

        }catch(IOException e){}

        if(thread==null){

            thread = new Thread(this);

            thread.setPriority(Thread.MIN_PRIORITY);

            thread.start();

        }

    }

    public void run(){

        String s = null;

        while(true){

            try{

                s = in.readUTF();

            }catch(IOException e){}

            if(s.equals(“結束”)){

                try{

                    socket.close();break;

                }catch(IOException e){}

            }else texA.append(s + “\n”);

        }

    }

    public void actionPerformed(ActionEvent e){

        if(e.getSource()==button){

            String s = textF.getText();

            if(s! = null){

                try{

                    out.writeUTF(s);

                }catch(IOException e1){}

            }

            else{

                try{

                    out.writeUTF(“請說話”);

                }

                catch(IOException e1){}

            }

        }

    }

}

【例 13-6】對應例10.5客戶端小應用程序的服務器端小應用程序。程序以端4441建立與客戶端的套接字連接,服務器端收到客戶端的申請后,以客戶的套接字建立一個線程,并啟動。如果沒有客戶申請,則繼續監聽客戶的申請。線程按客戶的套接字建立輸入數據流in和輸數據流out。線程利用in讀取客戶放入線路里的信息。如果接受的信息是“結束”,則服務器回復“結束”后關閉套接字連接;否則回復:“我是服務器你對我說“,以及服務器接收到的信息。

import java.net.*;

import java.io.*;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import java.applet.*;

public class Aclient extends Applet implements Runnable,ActionListener{

    JButton button; JTextField textF; JTextArea textA;

    Socket socket; Thread thread;

    DataInputStream in; DataOutputStream out;

    public void init(){

        setBackground(new Color(120,153,137));

        setLayout(new BorderLayout());

        Button = new JButton(“發送信息”);

        textF = new JTextField(20);

        textA = new JTextArea(20,30);

        setSize(450,350);

        JPanel p = new JPanel();

        p.add(textF); p.add(button);

        add(textA,”Center”); add(p,”South”);

        button.addActionListener(this);

    }

    public void start(){

        try{

            socket = new Socket(this.getCodeBase().getHost(),4441);

            in = new DataInputStream(socket.getInputStream());

            out = new DataOutputStream(socket.getOutputStream());

        }catch(IOException e){}

        if(thread==null){

            thread = new Thread(this);

            thread.setPriority(Thread.MIN_PRIORITY);

            thread.start();

        }

    }

    public void run(){

        String s = null;

        while(true){

             try{

                s = in.readUTF();

            }catch(IOException e){}

            if(s.equals(“結束”)){

                try{

                    socket.close();break;

                }catch(IOException e){}

            }else texA.append(s + “\n”);

        }

    }

    public void actionPerformed(ActionEvent e){

        if(e.getSource()==button){

            String s = textF.getText();

            if(s! = null){

                try{

                    out.writeUTF(s);

                }catch(IOException e1){}

            }

            else{

                try{

                    out.writeUTF(“請說話”);

                }catch(IOException e1){}

            }

       }

    }

}

頂一下
(0)
0%
踩一下
(0)
0%
------分隔線----------------------------
------分隔線----------------------------
Java教程
1、Java 概述
1.1 Java語言概述
1.2 Java虛擬機以及跨平臺原理
1.3 Java的主要就業方向
1.4 Java的不同版本
1.5 Java開發環境搭建
1.6 第一個Java程序示例
1.7 Java類和對象的概念
1.8 Java類庫及其組織結構
1.9 Java import
2、Java 語法基礎
2.1 Java數據類型以及變量的定義
2.2 Java數據類型轉換
2.3 Java運算符
2.4 Java流程控制
2.5 Java數組的定義和使用
2.6 Java字符串(String)
2.7 Java StringBuffer與StringBuider
2.8 強調一下編程風格
3、Java 類與對象
3.1 Java類的定義及其實例化
3.2 Java訪問修飾符
3.3 Java變量的作用域
3.4 Java this關鍵字詳解
3.5 Java方法重載
3.6 Java類的基本運行順序
3.7 Java包裝類、拆箱和裝箱詳解
3.8 再談Java包
3.9 源文件的聲明規則
4、Java 繼承和多態
4.1 繼承的概念與實現
4.2 Java super關鍵字
4.3 繼承中的方法的覆蓋和重載
4.4 多態和動態綁定
4.5 instanceof 運算符
4.6 多態對象的類型轉換
4.7 Java static關鍵字
4.8 Java final關鍵字
4.9 Java Object類
5、面向對象高級特性
5.1 Java內部類及其實例化
5.2 內部類的分類
5.3 抽象類的概念和使用
5.4 接口的概念和使用
5.5 接口和抽象類的區別
5.6 Java 泛型
5.7 泛型通配符和類型參數的范圍
6、異常處理
6.1 異常處理基礎
6.2 異常類型Java語言中常見的異常類型有哪些
6.3 未被捕獲的異常
6.4 try和catch的使用
6.5 多重catch語句的使用
6.6 try語句的嵌套
6.7 throw:異常的拋出
6.8 throws子句
6.9 finally塊
6.10 Java的內置異常
6.11 創建自己的異常子類
6.12 斷言
7、線程編程
7.1 線程的概念
7.2 Java線程模型
7.3 主線程
7.4 創建線程
7.5 創建多線程
7.6 isAlive()和join()的使用
7.7 線程優先級
7.8 線程同步
7.9 線程間通信
7.10 線程死鎖
7.11 線程的掛起、恢復和終止
8、輸入輸出(IO)操作
8.1 輸入輸出基本概念
8.2 面向字符的輸入流
8.3 面向字符的輸出流
8.4 面向字節的輸入輸出流
8.5 面向字節流的應用
8.6 文件與目錄管理
8.7 文件的隨機讀寫
8.8 文件的壓縮處理
9、常用類庫、向量與哈希
9.1 Java基礎類庫
9.2 Object類
9.3 Java語言包(java.lang)簡介
9.4 日期和時間類
9.5 向量及其應用
9.6 哈希表及其應用
10、圖形界面(GUI)設計
10.1 圖形界面設計基礎
10.2 框架窗口
10.3 標簽、按鈕和按鈕事件
10.4 面板
10.5 布局設計
10.6 文本框和文本區
10.7 文本框和文本區的輸入輸出
10.8 選擇框和單選按鈕
10.9 列表和組合框
10.10 菜單
10.11 對話框
10.12 滾動條
10.13 鼠標事件
10.14 鍵盤事件
11、圖形、圖像與多媒體
11.1 繪圖基礎
11.2 設置字型和顏色
11.3 繪圖模式
11.4 Graphics類的繪圖方法
11.5 Graphics2D類的繪圖方法
11.6 圖像處理基礎
11.7 圖像緩沖技術
11.8 多媒體基礎
12、網絡與數據庫編程
12.1 IP地址和InetAddress類
12.2 統一資源定位符
12.3 套接字(Socket)
12.4 數據庫連接
12.5 幾個重要的類和接口
12.6 數據庫查詢
12.7 數據庫更新
12.8 插入記錄
12.9 修改記錄
12.10 刪除記錄
激情色播