熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

三步學會Java Socket編程

2013-11-23 18:43:40  來源: Java核心技術 

  第一步 充分理解Socket
  什麼是socket
  所謂socket通常也稱作套接字用於描述IP地址和端口是一個通信鏈的句柄應用程序通常通過套接字向網絡發出請求或者應答網絡請求
  以JSDK為例Socket和ServerSocket類庫位於包中ServerSocket用於服務器端Socket是建立網絡連接時使用的在連接成功時應用程序兩端都會產生一個Socket實例操作這個實例完成所需的會話對於一個網絡連接來說套接字是平等的並沒有差別不因為在服務器端或在客戶端而產生不同級別不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的
  重要的Socket API
  Socket繼承於javalangObject有八個構造器其方法並不多下面介紹使用最頻繁的三個方法其它方法大家可以見JDK文檔
   Accept方法用於產生阻塞直到接受到一個連接並且返回一個客戶端的Socket對象實例阻塞是一個術語它使程序運行暫時停留在這個地方直到一個會話產生然後程序繼續通常阻塞是由循環產生的
   getInputStream方法獲得網絡連接輸入同時返回一個IutputStream對象實例
   getOutputStream方法連接的另一端將得到輸入同時返回一個OutputStream對象實例
  注意其中getInputStream和getOutputStream方法均會產生一個IOException它必須被捕獲因為它們返回的流對象通常都會被另一個流對象使用
  如何開發一個ServerClient模型的程序
  開發原理
  服務器使用ServerSocket監聽指定的端口端口可以隨意指定(由於以下的端口通常屬於保留端口在一些操作系統中不可以隨意使用所以建議使用大於的端口)等待客戶連接請求客戶連接後會話產生在完成會話後關閉連接
  客戶端使用Socket對網絡上某一個服務器的某一個端口發出連接請求一旦連接成功打開會話會話完成後關閉Socket客戶端不需要指定打開的端口通常臨時的動態的分配一個以上的端口{建立服務器}
  import *;
  import javaio*;
  public class Server
  {
  private ServerSocket ss;
  private Socket socket;
  private BufferedReader in;
  private PrintWriter out;
  public Server()
  {
  try
  {
  ss = new ServerSocket();
  while (true)
  {
  socket = ssaccept();
  in = new BufferedReader(new InputStreamReader(socketgetInputStream()));
  out = new PrintWriter(socketgetOutputStream()true);
  String line = inreadLine();
  outprintln(you input is : + line);
  outclose();
  inclose();
  socketclose();
  }
  ssclose();
  }
  catch (IOException e)
  {}
  }
  public static void main(String[] args)
  {
  new Server();
  }
  }
  這個程序建立了一個服務器它一直監聽端口等待用戶連接在建立連接後給客戶端返回一段信息然後結束會話這個程序一次只能接受一個客戶連接
  {建立客戶端}
  import javaio*;
  import *;
  public class Client
  {
  Socket socket;
  BufferedReader in;
  PrintWriter out;
  
  public Client()
  {
  try
  {
  socket = new Socket(xxxxxxxxxxxx );
  in = new BufferedReader(new InputStreamReader(socketgetInputStream()));
  out = new PrintWriter(socketgetOutputStream()true);
  BufferedReader line = new BufferedReader(new InputStreamReader(Systemin));
  
  outprintln(linereadLine());
  lineclose();
  outclose();
  inclose();
  socketclose();
  }
  catch (IOException e)
  {}
  }
  public static void main(String[] args)
  {
  new Client();
  }
  }
  這個客戶端連接到地址為xxxxxxxxxxxx的服務器端口為並從鍵盤輸入一行信息發送到服務器然後接受服務器的返回信息最後結束會話
  第二步 多個客戶同時連接
  在實際的網絡環境裡同一時間只對一個用戶服務是不可行的一個優秀的網絡服務程序除了能處理用戶的輸入信息還必須能夠同時響應多個客戶端的連接請求在java中實現以上功能特點是非常容易的
  設計原理
  主程序監聽一端口等待客戶接入同時構造一個線程類准備接管會話當一個Socket會話產生後將這個會話交給線程處理然後主程序繼續監聽運用Thread類或Runnable接口來實現是不錯的辦法
  {實現消息共享}
  import javaio*;
  import *;
  
  public class Server extends ServerSocket
  {
  private static final int SERVER_PORT = ;
  
  public Server() throws IOException
  {
  super(SERVER_PORT);
  
  try
  {
  while (true)
  {
  Socket socket = accept();
  new CreateServerThread(socket);
  }
  }
  catch (IOException e)
  {}
  finally
  {
  close();
  }
  }
  // CreateServerThread
  class CreateServerThread extends Thread
  {
  private Socket client;
  private BufferedReader in;
  private PrintWriter out;
  public CreateServerThread(Socket s) throws IOException
  {
  client = s;
  in = new BufferedReader(new InputStreamReader(clientgetInputStream() GB));
  out = new PrintWriter(clientgetOutputStream() true);
  outprintln( Welcome );
  start();
  }
  
  public void run()
  {
  try
  {
  String line = inreadLine();
  
  while (!lineequals(bye))
  {
  String msg = createMessage(line);
  outprintln(msg);
  line = inreadLine();
  }
  outprintln( See you bye! );
  clientclose();
  }
  catch (IOException e)
  {}
  }
  private String createMessage(String line)
  {
  xxxxxxxxx;
  }
  }
  public static void main(String[] args) throws IOException
  {
  new Server();
  }
  }
  這個程序監聽端口並將接入交給CreateServerThread線程運行CreateServerThread線程接受輸入並將輸入回應客戶直到客戶輸入bye線程結束我們可以在createMessage方法中對輸入進行處理並產生結果然後把結果返回給客戶
  第三步 實現信息共享:在Socket上的實時交流
  網絡的偉大之一也是信息共享Server可以主動向所有Client廣播消息同時Client也可以向其它Client發布消息下面看看如何開發一個可以實時傳遞消息的程序
  設計原理
  服務器端接受客戶端的連接請求同時啟動一個線程處理這個連接線程不停的讀取客戶端輸入然後把輸入加入隊列中等候處理在線程啟動的同時將線程加入隊列中以便在需要的時候定位和取出
  {源碼}
  import javaio*;
  import *;
  import javautil*;
  import javalang*;
  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 = ;
  private static boolean isClear = true;
  protected static final int SERVER_PORT = ;
  protected FileOutputStream LOG_FILE = new FileOutputStream(d:/connectlog true);
  
  public Server() throws FileNotFoundException IOException
  {
  super(SERVER_PORT);
  new Broadcast();
  //append connection log
  Calendar now = CalendargetInstance();
  String str = [ + nowgetTime()toString() + ] Accepted a connection\\;
  byte[] tmp = strgetBytes();
  LOG_FILEwrite(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_ArraygetFirst();
  for (int i = ; i < Threader.size(); i++)
  {
  CreateServerThread client = (CreateServerThread)Threader.get(i); From:http://tw.wingwit.com/Article/program/Java/hx/201311/25633.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.