Java Socket編程如何建立兩者關(guān)系

      網(wǎng)友投稿 709 2025-04-01

      事實(shí)上網(wǎng)絡(luò)編程簡(jiǎn)單的理解就是兩臺(tái)計(jì)算機(jī)相互通訊數(shù)據(jù)而已.對(duì)于程序員而言,去掌握一種編程接口并使用一種編程模型相對(duì)就會(huì)顯得簡(jiǎn)單的多了.Java SDK提供一些相對(duì)簡(jiǎn)單的Api來完成這些工作.Java SOCKET編程就是其中之一.對(duì)于Java而言.這些Api存在與java.net 這個(gè)包里面.因此只要導(dǎo)入這個(gè)包就可以準(zhǔn)備網(wǎng)絡(luò)編程了.

      網(wǎng)絡(luò)編程的基本模型就是客戶機(jī)到服務(wù)器模型.簡(jiǎn)單的說就是兩個(gè)進(jìn)程之間相互通訊,然后其中一個(gè)必須提供一個(gè)固定的位置,而另一個(gè)則只需要知道這個(gè)固定的位置.并去建立兩者之間的聯(lián)系..然后完成數(shù)據(jù)的通訊就可以了.這里提供固定位置的通常稱為服務(wù)器,而建立聯(lián)系的通常叫做客戶端.基于這個(gè)簡(jiǎn)單的模型,就可以進(jìn)入網(wǎng)絡(luò)編程啦.

      Java對(duì)這個(gè)模型的支持有很多種Api.而這里我只想介紹有關(guān)Java SOCKET編程的編程接口.對(duì)于Java而言已經(jīng)簡(jiǎn)化了Socket的編程接口.首先我們來討論有關(guān)提供固定位置的服務(wù)方是如何建立的.Java提供了ServerSocket來對(duì)其進(jìn)行支持.事實(shí)上當(dāng)你創(chuàng)建該類的一個(gè)實(shí)力對(duì)象并提供一個(gè)端口資源你就建立了一個(gè)固定位置可以讓其他計(jì)算機(jī)來訪問你.ServerSocket server=new ServerSocket(6789);這里稍微要注意的是端口的分配必須是唯一的.因?yàn)槎丝谑菫榱宋ㄒ粯?biāo)識(shí)每臺(tái)計(jì)算機(jī)唯一服務(wù)的.另外端口號(hào)是從0~65535之間的,前1024個(gè)端口已經(jīng)被Tcp/Ip 作為保留端口,因此你所分配的端口只能是1024個(gè)之后的.好了.

      我們有了固定位置.現(xiàn)在所需要的就是一根連接線了.該連接線由客戶方首先提出要求.因此Java同樣提供了一個(gè)Java Socket編程對(duì)象來對(duì)其進(jìn)行支持.只要客戶方創(chuàng)建一個(gè)Socket的實(shí)例對(duì)象進(jìn)行支持就可以了.Socket client=new Socket(InetAddress.getLocalHost(),5678);客戶機(jī)必須知道有關(guān)服務(wù)器的IP地址.對(duì)于著一點(diǎn)Java也提供了一個(gè)相關(guān)的類InetAddress 該對(duì)象的實(shí)例必須通過它的靜態(tài)方法來提供.它的靜態(tài)方法主要提供了得到本機(jī)IP 和通過名字或IP直接得到InetAddress的方法.

      好了.上面的方法基本可以建立一條連線讓兩臺(tái)計(jì)算機(jī)相互交流了.可是數(shù)據(jù)是如何傳輸?shù)哪?事實(shí)上I/O操作總是和網(wǎng)絡(luò)編程息息相關(guān)的.因?yàn)榈讓拥木W(wǎng)絡(luò)是繼續(xù)數(shù)據(jù)的.除非遠(yuǎn)程調(diào)用,處理問題的核心在執(zhí)行上.否則數(shù)據(jù)的交互還是依賴于IO操作的.所以你也必須導(dǎo)入java.io這個(gè)包.java的IO操作也不復(fù)雜.它提供了針對(duì)于字節(jié)流和Unicode的讀者和寫者,然后也提供了一個(gè)緩沖用于數(shù)據(jù)的讀寫.

      BufferedReader?in=new?BufferedReader(new?InputStream

      Reader(server.getInputStream()));

      PrintWriter?out=new?PrintWriter(server.getOutputStream());

      上面兩句就是建立緩沖并把原始的字節(jié)流轉(zhuǎn)變?yōu)閁nicode可以操作.而原始的字節(jié)流來源于Java Socket編程的兩個(gè)方法.getInputStream()和getOutputStream()方.分別用來得到輸入和輸出.那么現(xiàn)在有了基本的模型和基本的操作工具.我們可以做一個(gè)簡(jiǎn)單的Socket例程了.

      服務(wù)方:

      import?java.io.*;

      import?java.net.*;

      public?class?MyServer?{

      public?static?void?main(String[]?args)?throws?IOException{

      ServerSocket?server=new?ServerSocket(5678);

      Socket?client=server.accept();

      BufferedReader?in=new?BufferedReader(new?InputStreamReader

      (client.getInputStream()));

      PrintWriter?out=new?PrintWriter(client.getOutputStream());

      while(true){

      String?str=in.readLine();

      System.out.println(str);

      out.println("has?receive....");

      out.flush();

      if(str.equals("end"))

      break;

      }

      client.close();

      }

      }

      這個(gè)Java Socket編程的主要目的在于服務(wù)器不斷接收客戶機(jī)所寫入的信息只到.客戶機(jī)發(fā)送"End"字符串就退出程序.并且服務(wù)器也會(huì)做出"Receive"為回應(yīng).告知客戶機(jī)已接收到消息。

      Socket通信讀取有不少需要我們注意的知識(shí)點(diǎn)。當(dāng)我們?cè)谑褂玫臅r(shí)候有很多的問題擺在我們面前。下面我們就來詳細(xì)的學(xué)習(xí)有關(guān)Java Socket通信讀取的相關(guān)代碼編寫。

      以下是Java Socket通信讀取的相關(guān)代碼。

      import?java.io.BufferedReader;

      import?java.io.BufferedWriter;

      import?java.io.File;

      import?java.io.FileWriter;

      import?java.io.InputStreamReader;

      import?java.net.URL;public?class?URLReader?{

      /**

      *?@param?args

      *?@throws?Exception

      */

      public?static?void?main(String[]?args)?throws?Exception?{

      //?聲明拋出所有例外

      URL?tirc?=?new?URL(http://www.sina.com);

      File?writeFile?=?new?File("d:\style_1.html");

      //?構(gòu)建一URL對(duì)象14100

      BufferedReader?in?=?new?BufferedReader(new?InputStreamReader(tirc.openStream()));

      BufferedWriter?bos?=?new?BufferedWriter(new?FileWriter(writeFile));

      //byte[]?b=new?byte[4096];

      String?inputLine;

      //?使用openStream得到一輸入流并由此構(gòu)造一個(gè)BufferedReader對(duì)象

      while?((ininputLine?=?in.readLine())?!=?null){

      bos.write(inputLine);

      System.out.println(inputLine);

      }

      bos.flush();

      in.close();

      bos.close();

      }

      }

      這就是傳說中的Java Socket通信讀取相關(guān)代碼的介紹。

      Java Socket線程我們經(jīng)常會(huì)用到的技術(shù),但是有很多程序員還是有不少的使用問題,下面我們就看看如何才能進(jìn)行有關(guān)的代碼編寫,希望大家又說收獲。網(wǎng)絡(luò)的偉大之一也是信息共享,Server可以主動(dòng)向所有Client廣播消息,同時(shí)Client也可以向其它Client發(fā)布消息。

      下面看看如何開發(fā)一個(gè)可以實(shí)時(shí)傳遞消息的程序。

      Java Socket線程的設(shè)計(jì)原理:

      服務(wù)器端接受客戶端的連接請(qǐng)求,同時(shí)啟動(dòng)一個(gè)線程處理這個(gè)連接,線程不停的讀取客戶端輸入,然后把輸入加入隊(duì)列中,等候處理。在線程啟動(dòng)的同時(shí)將線程加入隊(duì)列中,以便在需要的時(shí)候定位和取出。

      {源碼}

      import?java.io.*;

      import?java.net.*;

      import?java.util.*;

      import?java.lang.*;

      public?class?Server?extends?ServerSocket

      {

      private?static?ArrayList?User_List?=?new?ArrayList();

      private?static?ArrayList?Threader?=?new?ArrayList();

      private?static?LinkedList?Message_Array?=?new?LinkedList();

      private?static?int?Thread_Counter?=?0;

      private?static?boolean?isClear?=?true;

      protected?static?final?int?SERVER_PORT?=?10000;

      protected?FileOutputStream?LOG_FILE?=?new?FileOutputStream("d:/connect.log",?true);

      public?Server()?throws?FileNotFoundException,?IOException

      {

      super(SERVER_PORT);

      new?Broadcast();

      //append?connection?log

      Calendar?now?=?Calendar.getInstance();

      String?str?=?"["?+?now.getTime().toString()?+?"]?Accepted?a?connection1512";

      byte[]?tmp?=?str.getBytes();

      LOG_FILE.write(tmp);

      try

      {

      while?(true)

      {

      Socket?socket?=?accept();

      new?CreateServerThread(socket);

      }

      }

      finally

      {

      close();

      }

      }

      public?static?void?main(String[]?args)?throws?IOException

      {

      new?Server();

      }

      //---?Broadcast

      class?Broadcast?extends?Thread

      {

      public?Broadcast()

      {

      start();

      }

      public?void?run()

      {

      while?(true)

      {

      if?(!isClear)

      {

      String?tmp?=?(String)Message_Array.getFirst();

      for?(int?i?=?0;?i?

      {

      CreateServerThread?client?=?(CreateServerThread)Threader.get(i);

      client.sendMessage(tmp);

      }

      Message_Array.removeFirst();

      isClear?=?Message_Array.size()?>?0???false?:?true;

      }

      }

      }

      }

      //---?CreateServerThread

      class?CreateServerThread?extends?Thread

      {

      private?Socket?client;

      private?BufferedReader?in;

      private?PrintWriter?out;

      private?String?Username;

      public?CreateServerThread(Socket?s)?throws?IOException

      {

      client?=?s;

      in?=?new?BufferedReader(new?InputStreamReader(client.getInputStream()));

      out?=?new?PrintWriter(client.getOutputStream(),?true);

      out.println("---?Welcome?to?this?chatroom?---");

      out.println("Input?your?nickname:");

      start();

      }

      public?void?sendMessage(String?msg)

      {

      out.println(msg);

      }

      public?void?run()

      {

      try

      {

      int?flag?=?0;

      Thread_Counter++;

      String?line?=?in.readLine();

      while?(!line.equals("bye"))

      {

      if?(line.equals("l"))

      {

      out.println(listOnlineUsers());

      line?=?in.readLine();

      continue;

      }

      if?(flag++?==?0)

      {

      Java Socket編程如何建立兩者關(guān)系

      Username?=?line;

      User_List.add(Username);

      out.println(listOnlineUsers());

      Threader.add(this);

      pushMessage("[]");

      }

      else

      {

      pushMessage("<"?+?Username?+?">"?+?line);

      }

      line?=?in.readLine();

      }

      out.println("---?See?you,?bye!?---");

      client.close();

      }

      catch?(IOException?e)

      {}

      finally

      {

      try

      {

      client.close();

      }

      catch?(IOException?e)

      {}

      Thread_Counter--;

      Threader.remove(this);

      User_List.remove(Username);

      pushMessage("[]");

      }

      }

      private?String?listOnlineUsers()

      {

      String?s?="-+-?Online?list?-+-1512";

      for?(int?i?=?0;?i?

      {

      s?+=?"["?+?User_List.get(i)?+?"]1512";

      }

      s?+=?"-+---------------------+-";

      return?s;

      }

      private?void?pushMessage(String?msg)

      {

      Message_Array.addLast(msg);

      isClear?=?false;

      }

      }

      }

      以上就是對(duì)Java Socket線程的詳細(xì)介紹。這就是程序運(yùn)行后,多用戶登陸并且輸入信息后的屏幕。實(shí)現(xiàn)了信息的實(shí)時(shí)廣播。用戶輸入"l"就可以列出在線人員表。

      Java Socket編程

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Excel 復(fù)雜報(bào)表巧用函數(shù)“平衡”
      下一篇:Excel函數(shù)學(xué)習(xí)之聊聊SUMPRODUCT函數(shù)(excel表格中sumproduct函數(shù)用法)
      相關(guān)文章
      久久国产亚洲精品| 亚洲色欲色欲www在线丝| 亚洲日韩中文无码久久| 亚洲色一区二区三区四区| 亚洲精品国产免费| 亚洲欧洲免费视频| 国产亚洲一区二区在线观看| 国产综合成人亚洲区| 自拍偷区亚洲国内自拍| 亚洲高清中文字幕| 亚洲av日韩av无码| 国产成人亚洲综合无码精品| 国产亚洲美女精品久久久| 亚洲&#228;v永久无码精品天堂久久| 国产精品高清视亚洲一区二区| 亚洲乱码在线播放| 亚洲欧洲日产国码www| 久久亚洲精品无码AV红樱桃| 久久夜色精品国产噜噜噜亚洲AV | 亚洲乱码中文字幕在线| 亚洲日本乱码一区二区在线二产线 | 亚洲狠狠婷婷综合久久久久| 久久国产亚洲精品麻豆| 亚洲bt加勒比一区二区| 亚洲黄色片免费看| 精品亚洲AV无码一区二区| 亚洲中文字幕乱码熟女在线| 亚洲AV无码专区亚洲AV桃| 亚洲精品国产成人影院| 在线亚洲精品福利网址导航| 亚洲精品V欧洲精品V日韩精品| 亚洲成人中文字幕| 亚洲一区二区三区免费在线观看| 在线亚洲高清揄拍自拍一品区 | 久久精品亚洲日本佐佐木明希| 亚洲一区综合在线播放| 亚洲一区二区三区在线| 色婷婷亚洲一区二区三区| 亚洲深深色噜噜狠狠爱网站| 亚洲国产精品热久久| 亚洲一卡2卡4卡5卡6卡残暴在线|