Java語音Socket接口用法詳解

Socket接口用法詳解java

 

在Java中,基於TCP協議實現網絡通訊的類有兩個,在客戶端的Socket類和在服務器端的ServerSocket類,ServerSocket類的功能是創建一個Server,並經過accept()方法隨時監聽客戶端的鏈接請求。程序員

擴展:編程

ServerSocket中經常使用的構造函數及方法數組

構造函數:ServerSocket(intport) 這是一個構造方法,用於在當前的服務器默認的IP地址上監聽一個指定的端口,即在指定的IP和端口建立一個ServerSocket對象服務器

方法:微信

Socket accept()產生阻塞,監聽指定的端口,直至有客戶端發來鏈接請求網絡

void close() 關閉當前ServerSocket併發

InetAddressgetInetAddress() 返回ServerSocket監聽的,本機的IP地址socket

intgetLocalPort() 返回ServerSocket監聽的,本機的IP地址上指定的端口號函數

intgetSoTimeout();void setSoTimeout(int timeout) 設置鏈接過程當中沒有獲得相應的等待期限時間(TimeOut)

StringtoString()   以字符串的方式返回ServerSocket監聽的,本機的IP地址及其端口號

Socket類中經常使用的構造函數和方法

構造函數:Socket(InetAddressaddress,int port) 用於建立一個連接,向指定的IP地址上指定的端口的服務器端程序發送鏈接請求

Socket(Stringhost,int port)   同上,但該方法容許經過主機名字符串向服務器發送鏈接請求

方法:

void close()關閉當前的Socket 鏈接

InetAddressgetInetAddress() 返回Socket創建了鏈接的服務器的IP地址

InputStreamgetInputStream() 返回當前Socket的輸入流

OutputStreamgetOutStream() 返回當前Socket的輸出流

InetAddressgetLocalAddress() 返回和Socket進行鏈接的本地的IP地址

intgetLocalPort() 返回和Socket進行鏈接的本地的端口號

int getPort() 返回和Socket創建了鏈接的服務器的端口號

intgetSoTimeOut();void setSoTimeOut(int timeout) 設置鏈接過程當中沒有獲得相應的等待期限時間

String toString() 以字符串的方式返回Socket的屬性信息

 

Socket類的構造方法包括如下幾種:

public Socket(String host,int port)

public Socket(InetAddress address,int port)

public Socket(String host,int port,InetAddresslocalAddr,int localPort)

public Socket(InetAddress host,int port, InetAddress,localAddr,intlocalPort)

在JDK1.1之前,Socket類可同時用於TCP/UDP通訊:

public Socket(String host,int port,Booleanstream)

public Socket(InetAddress host,int port, Booleanstream)

Socket類的輸入/輸出流管理包括如下方法:

public InputStream getInputStream()

public void shutdowmInput()

public OutputStream get OutputStream ()

public void shutdowmOutput()

以上這些方法都將拋出IOException異常,程序中須要捕獲並處理。

關閉Socket的方法爲:

public void close() throws IOException

設置/獲取Socket數據的方法爲:

public InetAddress getInetAddress()

public int getPort()

public void setSoTimeout(int timeout)

這些方法都將拋出SocketException異常,程序中須要捕獲並處理。

ServerSocket類的構造方法包括如下幾種:

public ServerSocket (int Port)

public ServerSocket (int Port,int backlog):支持指定數目的鏈接

public ServerSocket (int Port,intbacklog,InetAddress bindAddr)

這些方法都將拋出IOException異常,程序中須要捕獲並處理。

public Socket  accept():等待客戶端的鏈接

public void close():關閉Socket

設置/獲取Socket數據的方法包括:

public InetAddress  get InetAddress ()

public int getLocalPort()

public void setSoTimeout(int timeout)

這些方法都將拋出SocketException異常,程序中須要捕獲並處理。

Socket的基本概念

1.創建鏈接

當須要創建網絡鏈接時,必須有一臺機器運行一個程序,隨時等候鏈接,而另外一端的程序這對其發出鏈接請求。這一點同電話系統相似——必須有一方撥打電話,而另外一方必須等候電話連通。創建鏈接的過程爲:

(1)如今服務器端生成一個ServerSocket實例對象,隨時監聽客戶端的鏈接請求。

(2)當客戶端須要鏈接時,相應地要生成一個Socket實例對象,併發出鏈接請求,其中host參數指明該主機名,port#參數指明該主機端口號。

(3)服務器端經過accept()方法接收到客戶端的請求後,開闢一個接口與之進行鏈接,並生成所需的I/O數據流。

(4)客戶端和服務器端的通訊都是經過一對InputStream和OutputStream進行的,通訊結束後,兩端分別關閉對應的Socket接口。

2.鏈接地址

打電話時,呼叫方必須事先知道所需撥打的號碼,而程序創建網絡鏈接時,也一樣須要知道地址或主機名稱。另外,網絡鏈接還須要一個端口號(能夠將其看成電話的分機號),鏈接到正確的主機以後,須要對該鏈接確認特定口令。某些狀況下,還須要使用一個擴展號碼與網絡計費系統相連,因而相應地要有一個特定端口號用於鏈接計費程序。

3.端口號

在TCP/IP系統中,端口號由16位二進制整數組成,即在0-65535之間。實際應用中,前1024個端口號已經預先定義爲一些特定服務,所以通常不能使用,除非想同這些服務器進行鏈接(如Telnet,SMTP,mail,ftp等)。在兩個程序鏈接以前,彼此之間必須達成一致,即由客戶端負責初始化鏈接,而服務器隨時等候請求。只有客戶端和服務器端指定端口號一致時鏈接纔會創建。若是系統中兩個程序所用端口號不一致,這鏈接沒法創建。

4.網絡鏈接模式

在Java中,TCP/IP接口的鏈接是由java.net包中的類實現的。如圖表示的是Socket鏈接過程當中客戶端和服務器端的工做原理。

 

每一個server端都擁有一個端口號,一臺機器上若是運行多個服務,這可能對應多個端口號。通訊結束後,兩端分別關閉對應的Socket接口,而不影響其餘的端口。

Socket通訊的基本步驟

使用Socket方式進行網絡通訊的程序基本結構都是相似的,不管一個Socket通訊程序的功能多麼齊全、程序多麼複雜,其基本結構都是同樣的。客戶端與服務器端進行通訊的過程都包括如下四個基本步驟:

(1)在服務器端指定一個用來等待鏈接的端口號,在客戶端規定一個主機和端口號,從而在客戶端和服務器端建立Socket/ServerSocket實例。

(2)打開鏈接到Socket的輸入輸出流。

(3)利用輸入輸出流,按照必定的協議對Socket進行讀寫操做。

(4)關閉輸入輸出流和Socket

一般,程序員的主要工做時針對所要完成的功能砸器第(3)步進行編程,第(1)、(2)、(4)步對全部的通訊程序來講幾乎都是同樣的。

Socker通訊的程序設計

1.服務器端程序

TCP/IP服務器端應用程序是經過Java語言中提供的ServerSocket和Socket這兩個有關網絡的類來實現的。而ServerSocket類除了創建一個Server以外,還經過accept()方法提供了隨時監聽客戶端鏈接請求的功能,它的構造方法有如下兩種。

ServerSocket(int port)

ServerSocket(int port,int backlog)

其中port是指鏈接中對方的端口號,backlog則表示服務器端所能支持的最大鏈接數。下面的程序用來監聽客戶端應用程序創建鏈接的請求,並在鏈接創建後向客戶端發送信息。

/**

 * 功能:這是服務器端程序,用來監聽客戶端應用程序創建鏈接的請求,並在鏈接創建後向客戶端發送信息

 */

package com.xushouwei;

//引入相應的包

import java.net.*;

import java.io.*;

public class TServer

{

   public static void main(String[] args)

   {

      //定義ServerSocket類

      ServerSocket s=null;

      //定義Socket類

      Socket s1;

      //定義發送字符串

      String sendString="你好!我是徐守威...";

      //獲得發送字符串的長度

      int s1lenth=sendString.length();

      //定義OutputStream類

      OutputStream s1out;

      //定義DataOutputStream類

      DataOutputStream dos;

      //經過1314端口創建鏈接

      try

      {

        //建立ServerSocket並把傳入端口號

        s=new ServerSocket(1314);

      } catch (Exception e)

      {

        e.printStackTrace();

      }

      //循環運行監聽程序,以監視鏈接請求

      while(true)

      {

        try

        {

           //監聽端口請求,等待鏈接

           s1=s.accept();

           //獲得與socket相鏈接的數據流對象

           s1out=s1.getOutputStream();

           dos=new DataOutputStream(s1out);

           //發送字符串

           dos.writeUTF(sendString);

           //關閉數據流(但不是關閉Socket鏈接)

           dos.close();

           s1out.close();

           s1.close();

        } catch (Exception e)

        {

           e.printStackTrace();

        }

      }

   }

 

}

 

2.客戶端程序

TCP/IP服務器端應用程序是經過Java語言中提供的Socket類來實現的。一樣,Socket類提供了包括創建網絡鏈接在內的許多功能,它的構造方法有如下幾種:

Socket(InetAddress address,int port)

Socket(InetAddress address,int port,Booleanstream)

Socket(String host,int port)

Socket(String host,int port, InetAddresslocalAddr,int localPort)

其中,address、host和port分別指鏈接另外一方的IP地址、主機名稱和端口號,stream這表示該Socket是不是支持流的Socket,localAddr和localPort是本機的地址和端口號。下面程序用來與前面的服務器端程序創建鏈接,並將服務器端送來的信息顯示在標準輸出上。

/**

 * 功能:這是客戶端程序,用來與前面的服務器端程序創建鏈接,並將服務器端送來的信息顯示在標準輸出上

 */

package com.xushouwei;

//引入相應的包

import java.net.*;

import java.io.*;

public class TClint

{

   public static void main(String[] args)

   {

      //定義Socket類

      Socket s1;

      //定義InputStream類

      InputStream s1In;

      //定義DataInputStream類

      DataInputStream dis;

      try

      {

        //在端口1314打開鏈接

        s1=new Socket("127.0.0.1",1314);

        //得到socket端口的輸入句柄,並從中讀取數據

        s1In=s1.getInputStream();

        dis=new DataInputStream(s1In);

        String st=new String(dis.readUTF());

        System.out.println(st);

        //操做結束,關閉數據流及socket鏈接

        dis.close();

        s1In.close();

        s1.close();

      } catch (Exception e)

      {

        e.printStackTrace();

      }

   }

 

}

瞭解更多詳情請登陸超人學院網站http://www.crxy.cn或者關注CRXY大數據微信號:CRXY-CN

相關文章
相關標籤/搜索