• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      JAVA語(yǔ)言SOCKET機(jī)制的研究

      2011-04-08 09:09:03謝智明
      關(guān)鍵詞:服務(wù)器端鏈路客戶端

      謝智明

      (湖南科技學(xué)院 計(jì)算機(jī)與通信工程系,湖南 永州 425100)

      JAVA語(yǔ)言SOCKET機(jī)制的研究

      謝智明

      (湖南科技學(xué)院 計(jì)算機(jī)與通信工程系,湖南 永州 425100)

      本文研究了JAVA語(yǔ)言SOCKET機(jī)制,闡述了輸入/輸出流的概念,并應(yīng)用這一機(jī)制實(shí)現(xiàn)了C/S模式下網(wǎng)絡(luò)通信。

      JAVA;網(wǎng)絡(luò);SOCKET

      1 Socket 機(jī)制

      Socket是面向客戶/服務(wù)器模型設(shè)計(jì)的,網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)Socket。 Socket通常用來(lái)實(shí)現(xiàn)客戶方和服

      務(wù)方的連接。客戶程序可以向 Socket寫請(qǐng)求,服務(wù)器將處理此請(qǐng)求,然后通過(guò)Socket將結(jié)果返回給用戶。

      Socket通信機(jī)制提供了兩種通訊方式:有聯(lián)接和無(wú)聯(lián)接方式,分別面向不同的應(yīng)用需求。使用有聯(lián)接方式時(shí),通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。在該方式下,通信雙方必須創(chuàng)建一個(gè)聯(lián)接過(guò)程并建立一條通訊鏈路,以后的網(wǎng)絡(luò)通信操作完全在這一對(duì)進(jìn)程之間進(jìn)行,通信完畢關(guān)閉此聯(lián)接過(guò)程。使用無(wú)聯(lián)接方式時(shí)其系統(tǒng)開銷比無(wú)聯(lián)接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報(bào)服務(wù),不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達(dá)信宿。在該方式下,通信雙方不必創(chuàng)建一個(gè)聯(lián)接過(guò)程和建立一條通訊鏈路,網(wǎng)絡(luò)通信操作在不同的主機(jī)和進(jìn)程之間轉(zhuǎn)發(fā)進(jìn)行。

      2 Java中輸入/輸出流概念

      過(guò)濾流DataInputStream 和DataOutputStream 除了分別作為 FilterInputStream 和 FilterOutputStream的子類外,還分別實(shí)現(xiàn)了接口DataInput 和DataOutput。接口DataInput 中定義的方法,主要包括從流中讀取基本類型的數(shù)據(jù)、讀取一行數(shù)據(jù)、或者讀取指定長(zhǎng)度的字節(jié)數(shù),如 readBoolean()readInt()、readLine()、readFully()等。

      接口 DataOutput中定義的方法主要是向流中寫入基本類型的數(shù)據(jù)或者寫入一定長(zhǎng)度的字節(jié)數(shù)組,如writeChar()、writeDouble() DataInputStream可以從所連接的輸入流中讀取與機(jī)器無(wú)關(guān)的基本類型數(shù)據(jù),用以實(shí)現(xiàn)一種獨(dú)立于具體平臺(tái)的輸入方式;DataInputStream 可以向所連接的輸出流寫入基本類型的數(shù)據(jù)。

      3 客戶機(jī)/服務(wù)器通信的實(shí)現(xiàn)

      3.1 客戶端的編程流程:

      1、打開Socket,新建一個(gè)套接字;

      2、為套接字建立一個(gè)輸入和輸出流;

      3、根據(jù)服務(wù)器協(xié)議從套接字讀入或向套接字寫入;

      4、清除套接字和輸入/輸出流;

      3.2 服務(wù)器端的編程流程:

      1、打開Server Socket,創(chuàng)建一個(gè)服務(wù)器型套接字和一個(gè)普通套接字,服務(wù)器型套接字在指定端口為客戶端請(qǐng)求的Socket 服務(wù);

      2、使用ServerSocket類的accept()方法使服務(wù)器型套接字處于監(jiān)聽(tīng)狀態(tài)并把監(jiān)聽(tīng)結(jié)果返回給普通套接字;

      3、為該普通套接字創(chuàng)建輸入和輸出流;

      4、從輸入和輸出流中讀入或?qū)懭胱止?jié)流,進(jìn)行相應(yīng)的處理,并將結(jié)果返回給客戶端;

      5、在客戶端和服務(wù)器工作結(jié)束后關(guān)閉所有的對(duì)象,如服務(wù)器型的套接字,普通套接字,輸入和輸出流。

      正是由于Java系統(tǒng)具有基于Socket的靈活通信機(jī)制,因而其應(yīng)用程序能自由地打開和訪問(wèn)網(wǎng)絡(luò)上的對(duì)象,就象在本地文件系統(tǒng)中一樣。

      4 程序代碼清單

      服務(wù)器端程序負(fù)責(zé)與客戶端通信import java.io.*;

      import java.net.*;

      import java.lang.*;

      import T2;

      class ThreadEchoHandler extends Thread //創(chuàng)建線程

      {

      T2 theT2=new T2();

      Socket incoming;

      int counter;

      ThreadEchoHandler(Socket i,int c)

      { incoming=i;

      counter=c; }

      public void run()

      { try

      {

      DataInputStream in=new

      DataInputStream(incoming.getInputStream());

      DataOutputStream out=new

      DataOutputStream(incoming.get Out put Stream());

      System.out.println ("hello");

      boolean done=false;

      while(!done)

      { String aa="";

      String str=in.readUTF();

      //從客戶端得到字符串

      //在此加入各自的服務(wù)程序

      System.out.println (str);

      theT2.pass(str); //解碼

      theT2.tongji();

      //修改監(jiān)控庫(kù)中的信息

      aa=theT2.guan();

      //操縱數(shù)據(jù)庫(kù)

      System.out.println ("string z is:"+aa);

      if(aa.compareTo("null")!=0 )//若是查詢數(shù)據(jù)庫(kù),返回查詢后的結(jié)果

      {

      //若不是查詢數(shù)據(jù)庫(kù),不向客戶端輸出信息

      out.writeUTF(aa);

      out.flush(); }

      }//while

      incoming.close(); //線程關(guān)閉

      }//try

      catch(IOException e)

      {System.out.println(e);}

      }//end run

      }

      //----------------------------------------

      class S

      {

      public static void main(String[] args)

      {

      int i=1;

      try

      {

      ServerSocket s=new ServerSocket(1111);

      for(;;)

      {

      Socket incoming=s.accept();

      System.out.println("connect: "+i);

      new

      ThreadEchoHandler(incoming,i).start();

      i++;

      }

      }

      catch(Exception e)

      { System.out.println(e); }

      }

      }

      客戶端通信應(yīng)用程序 Echo.java

      import java.io.*;

      import java.net.*;

      import java.awt.*;

      import java.applet.*;

      public class Echo extends Applet

      {

      TextArea ta;

      Socket echoSocket;

      DataOutputStream os;

      DataInputStream is;

      String Line;

      public void init()

      {

      setBackground(Color.white);

      ta=new TextArea(5,80);

      ta.setEditable(false);

      add(ta);

      try

      {echoSocket=new Socket("10.102.4.41",1111);}

      //與服務(wù)器建立連接

      catch(IOException e)

      {System.out.println("error");}

      }

      public void st(String stri) //發(fā)送字符串的 方法

      {

      try

      { DataOutputStream os=new

      DataOutputStream(echoSocket.getOutputStream());

      DataInputStream is=new

      DataInputStream(echoSocket.getInputStream());

      os.writeUTF(""+ stri );

      //向服務(wù)器輸送string

      os.flush();

      }

      catch(IOException e)

      {System.out.println(" error:"+e); }

      }

      public String st1() //接收字符串的方法

      {

      String Line="";

      try

      { DataOutputStream os=new

      DataOutputStream(echoSocket.getOutputStream());

      DataInputStream is=new

      DataInputStream(echoSocket.getInputStream());

      Line=is.readUTF();

      //從服務(wù)器讀來(lái)的信息

      ta.appendText(""+Line);

      //在文本域中輸出信息

      }

      catch(IOException e)

      {System.out.println(" error:"+e); }

      return Line;

      }

      }

      5 研究小結(jié)

      在建立 Socket連接時(shí),兩端的端口號(hào)必須設(shè)為一致,否則建立不了連接。服務(wù)器端必須有主機(jī)IP地址或主機(jī)名參數(shù)。連接建立好之后應(yīng)確定輸入和輸出流。起初程序中用的是DataInputStream和PrintStream,結(jié)果只能傳輸英文 ,傳輸中文時(shí)產(chǎn)生亂碼,將PrintStream改為DataOutput Stream,使用readUTF()和writeUTF()方法后,中文傳輸問(wèn)題得到解決。如果一個(gè)使用某端口的程序沒(méi)有關(guān)閉,另一個(gè)程序就不能使用這個(gè)端口。

      [1]廖雷,等.Java程序設(shè)計(jì)教程[M].北京:中國(guó)電力出版社,2003.

      [2]張立,等.基于Client/Server模式的數(shù)據(jù)庫(kù)應(yīng)用軟件的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,1999,(4).

      TP311

      A

      1673-2219(2011)04-0070-03

      2010-4-29

      謝智明(1971-),湖南祁陽(yáng)人,碩士,計(jì)算機(jī)軟件與技術(shù)系統(tǒng)分析師,研究方向?yàn)橛?jì)算機(jī)及應(yīng)用。

      (責(zé)任編校:何俊華)

      猜你喜歡
      服務(wù)器端鏈路客戶端
      家紡“全鏈路”升級(jí)
      天空地一體化網(wǎng)絡(luò)多中繼鏈路自適應(yīng)調(diào)度技術(shù)
      縣級(jí)臺(tái)在突發(fā)事件報(bào)道中如何應(yīng)用手機(jī)客戶端
      孵化垂直頻道:新聞客戶端新策略
      基于Vanconnect的智能家居瘦客戶端的設(shè)計(jì)與實(shí)現(xiàn)
      淺析異步通信層的架構(gòu)在ASP.NET 程序中的應(yīng)用
      成功(2018年10期)2018-03-26 02:56:14
      在Windows中安裝OpenVPN
      基于3G的VPDN技術(shù)在高速公路備份鏈路中的應(yīng)用
      高速光纖鏈路通信HSSL的設(shè)計(jì)與實(shí)現(xiàn)
      客戶端空間數(shù)據(jù)緩存策略
      台东市| 谢通门县| 长宁区| 依兰县| 临沧市| 通城县| 正镶白旗| 恭城| 兰考县| 宣恩县| 望都县| 北安市| 九江县| 武清区| 辽中县| 芜湖县| 民权县| 湖北省| 思茅市| 巴东县| 虎林市| 青冈县| 宁化县| 龙岩市| 浙江省| 松桃| 沙河市| 久治县| 微博| 巧家县| 临武县| 广东省| 含山县| 朝阳市| 山东| 宝兴县| 绍兴县| 大同市| 黎平县| 富裕县| 鱼台县|