国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

比爾學Java:Java Socket篇

2019-11-18 12:14:48
字體:
來源:轉載
供稿:網友

  比爾最近接到一個項目,是要在原來的系統上實現客戶端與服務器的連接。原來的系統是用java開發的,項目組討后,決定應用Java提供的Socket類來解決問題。比爾是C開發的高手,對Java卻只略知皮毛。所以,比爾一頭扎進Java中,開始他的學習歷程。當然,首先還要解決眼前的問題,學習Socket編程。
  在學習Socket編程之前,先看看自己是否熟悉TCP、UDP、Ports等網絡基本概念,要是還不熟悉的話就得先去補補課羅!
  Socket 的基本概念
  1、Socket,也就是俗稱的套接字。
  2、Sun Java中的定義:是運行在網絡上的兩個程序間雙向通訊連接的末端,它提供客戶端和服務器端的連接通道。Socket綁定于特定端口這樣TCP層就知道將數據提供給哪個應用程序。
  3、字面上的理解,Socket的意思是"插座、孔",你還可以把它形象地理解為打電話用的電話機,你從聽筒里聽到對方聲音,同時將聲音通過話筒傳給對方。
  
  我想你現在和我剛開始的時候一樣:似乎有點明白,又似乎不是很明白,沒關系,我希望通過下面例子的講解你能夠徹底地把握它。在實例之前,讓我們先來看看Socket實現的基本原理。
  Socket編程實現原理
  從連接的建立到連接的結束,每個Socket應用都大致包含以下幾個基本步驟:
  1、服務器端socket綁定于特定端口,服務器偵聽socket等待連接請求;
  2、客戶端向服務器和特定端口提交連接請求;
  3、服務器接受連接,產生一新的socket,綁定到另一端口,由此socket來處理和客戶端的交互,服務器繼續偵聽原socket來接受其他客戶端的連接請求;
  
  4、連接成功后客戶端也產生一socket,并通過它來與服務器端通訊(注重:客戶端socket并不與特定端口綁定);
  5、接下來,服務器端和客戶端就通過讀取和寫入各自的socket來進行通訊。
  注重:本文中只講解基于TCP的Socket應用
  Java中的Socket類
  Java中提供兩個類(在java.net包中)——Socket和ServerSocket來分別實現客戶端和服務器端Socket。但Socket的實際工作是由抽象類SocketImpl的實例來完成的,這其實是設計模式中Abstract Factory模式的一個應用。
  
  ServerSocket類的常用構造器和主要方法:
  
  ServerSocket(int port) 在指定的端口號上產生一服務器端socket
  Socket accept()
  偵聽socket,接受連接
  Socket類的常見構造器和主要方法:
  
  Socket(String host, int port) 生成一socket并連接至指定的主機和端口
  InputStream getInputStream() 返回socket的輸入流
  OutputStream getOuputStream() 返回socket的輸出流
  一個客戶服務器實例
  了解了上面的一些基本知識以后,我想大家現在都迫不及待地想親自動手編寫自己的socket,那就讓我們開始吧!在這個例子中,我們模擬了一個Echo服務,它偵聽3333端口。客戶端接受用戶鍵盤輸入并向服務器端發出連接請求,服務器端接受客戶端連接,連接成功后建立會話,客戶端于是向服務器端發送用戶輸入信息,服務器端接收此信息并且簡單返回給客戶端。源碼如下:
  
  (服務器端)
  
  /**
   * <p>Title:EchoServer.java </p>
   * <p>Description: EchoServer create a echo-like server at port 3333</p>
   * @author Mac
   * @version 2002/9/2
   */
  
  import java.net.*;
  import java.io.*;
  
  public class EchoServer
  {
   public static void main (String[] args) throws IOException
   {
   ServerSocket echoServer = null;
   try
   {
   echoServer = new ServerSocket(3333); //creat a server socket at port
  3333(問題一)
   }
   catch(IOException e)
   {
   System.err.   System.exit(-1);
   }
  
   Socket echoClient = null;
   try
   {
   echoClient = echoServer.accept(); //accept a connection
   }
   catch(IOException e)
   {
   System.err.println("IO error:" + e.getMessage());
   System.exit(-1);
   }
  
   PrintWriter out = new PrintWriter(echoClient.getOutputStream(),true);
   //gets the socket's output stream and opens a PrintWriter on it
   //if you remove the argument true,what will happen?(問題三)
   BufferedReader in = new BufferedReader(
   new InputStreamReader(echoClient.getInputStream()));
   //gets the socket's input stream and opens a BufferedReader on it
   String strFromClient;
  
   while((strFromClient = in.readLine()) != null)
   {
   out.println("result is :" + strFromClient);
   }
  
   in.close();
   out.close();
   echoClient.close();
   echoServer.close();
   }
  }
  
  (客戶端)
  /**
   *<p>Title:EchoClient.java </p>
   *<p>Description: EchoClient creates a socket thereby getting a connection to
  echo-like server</p>
   * @author Mac Wang
   * @version 2002/8/30
   */
  
  import java.net.*;
  import java.io.*;
  
  public class EchoClient
  {
  
   public static void main(String[] args)
   {
   try
   {
  Socket echoClient = new Socket("yourhostname",3333);
  //creat a new socket connected to host and port 3333
   PrintWriter out = new PrintWriter(echoClient.getOutputStream(),true);
  
   BufferedReader in = new BufferedReader(
   new InputStreamReader(echoClient.getInputStream()));
   String fromServer,fromUser;
   BufferedReader stdIn = new BufferedReader(
   new InputStreamReader(System.in));
   //gets the system input stream and opens a BufferedReader on it
   while ((fromUser = stdIn.readLine()) != null)
   {
   if (fromUser.equals("bye")) break;
  //when user types "bye" then end
  
   System.out.println("input is:" + fromUser);
   out.println(fromUser);
  
   fromServer = in.readLine();
   System.out.println(fromServer);
   }
   out.close();
   in.close();
   echoClient.close();
   }
   catch(UnknownHostException e)
   {
   System.err.println("Unknown host:yourhostname");
   System.exit(1);
   }
   catch(IOException e)
   {
   System.err.println("I/0 error:" + e.getMessage());
   System.exit(1);
   }
   }
  }
  現在大家可以分別運行Server和Client,看看程序運行效果(注重:你必須將yourhostname替換成你自己的主機名或IP地址)。并且思考以下幾個問題:
  
  1、把端口號換成2222后看看程序運行效果?那么89呢?是不是任何數字都可以呢?
  
  2、假如不采用我們自己編寫的echo server,而是連接到系統本身提供的echo server(端口號為7),試試看會發生什么情況,客戶端Socket是否需要改變呢?
  
  3、去掉PrintWriter中的參數True,看看程序運行的效果?
  
  4、注重程序中是如何讀取和寫入Socket的?
  5、試著多打開幾個客戶端,看看效果如何?
  從問題5中大家可以看出來,上面的例子只支持一個用戶連接,那么如何支持多用戶的同時訪問呢?最簡單有效的方法就是利用多線程實現,每個線程對應一個用戶連接,server接受一個client連接后,就新產生一個線程,并交由它去處理余下的工作。下面就是支持多用戶的服務器端實現:
  /**
  *<p>Title:EchoMultiServer </p>
   *<p>Description: EchoServer create a echo-like server at port 3333 which supports
  multi-client</p>
   * @author Mac Wang
   * @version 2002/9/2
   */
  import java.net.*;
  import java.io.*;
  class EchoMultiServerThread extends Thread
  {
   private Socket echoClient = nul

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 陆丰市| 合水县| 永川市| 原阳县| 武清区| 天门市| 鱼台县| 门头沟区| 蓬安县| 修武县| 论坛| 普安县| 贵州省| 嘉义市| 合肥市| 青神县| 区。| 固始县| 兰州市| 平谷区| 阳春市| 辽中县| 黑山县| 南城县| 抚松县| 视频| 瑞金市| 军事| 深泽县| 晴隆县| 县级市| 子长县| 赣榆县| 庐江县| 龙岩市| 镇远县| 上虞市| 阳春市| 大宁县| 河东区| 水城县|