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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

三步學(xué)會(huì)JavaSocket編程

2019-11-18 15:48:23
字體:
供稿:網(wǎng)友

  第一步 充分理解Socket
  1.什么是socket
  所謂socket通常也稱作"套接字",用于描述
  以J2SDK-1.3為例,Socket和ServerSocket類庫位于
java.net包中。ServerSocket用于服務(wù)器端,Socket是建立網(wǎng)絡(luò)連接時(shí)使用的。在連接成功時(shí),應(yīng)用程序兩端都會(huì)產(chǎn)生一個(gè)Socket實(shí)例,操作這個(gè)實(shí)例,完成所需的會(huì)話。對(duì)于一個(gè)網(wǎng)絡(luò)連接來說,套接字是平等的,并沒有差別,不因?yàn)樵诜?wù)器端或在客戶端而產(chǎn)生不同級(jí)別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。
  重要的Socket API:
  java.net.Socket繼續(xù)于java.lang.Object,有八個(gè)構(gòu)造器,其方法并不多,下面介紹使用最頻繁的三個(gè)方法,其它方法大家可以見JDK-1.3文檔。
  . Accept方法用于產(chǎn)生"阻塞",直到接受到一個(gè)連接,并且返回一個(gè)客戶端的Socket對(duì)象實(shí)例。"阻塞"是一個(gè)術(shù)語,它使程序運(yùn)行暫時(shí)"停留"在這個(gè)地方,直到一個(gè)會(huì)話產(chǎn)生,然后程序繼續(xù);通常"阻塞"是由循環(huán)產(chǎn)生的。
  . getInputStream方法獲得網(wǎng)絡(luò)連接輸入,同時(shí)返回一個(gè)IutputStream對(duì)象實(shí)例,。
  . getOutputStream方法連接的另一端將得到輸入,同時(shí)返回一個(gè)OutputStream對(duì)象實(shí)例。
  注重:其中g(shù)etInputStream和getOutputStream方法均會(huì)產(chǎn)生一個(gè)IOException,它必須被捕捉,因?yàn)樗鼈兎祷氐牧鲗?duì)象,通常都會(huì)被另一個(gè)流對(duì)象使用。
  2.如何開發(fā)一個(gè)Server-Client模型的程序
  開發(fā)原理:
  服務(wù)器,使用ServerSocket監(jiān)聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統(tǒng)中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請(qǐng)求,客戶連接后,會(huì)話產(chǎn)生;在完成會(huì)話后,關(guān)閉連接。
  客戶端,使用Socket對(duì)網(wǎng)絡(luò)上某一個(gè)服務(wù)器的某一個(gè)端口發(fā)出連接請(qǐng)求,一旦連接成功,打開會(huì)話;會(huì)話完成后,關(guān)閉Socket。客戶端不需要指定打開的端口,通常臨時(shí)的、動(dòng)態(tài)的分配一個(gè)1024以上的端口。{建立服務(wù)器}
  import java.net.*;
  import java.io.*;
  public class Server
  {
  PRivate ServerSocket ss;
  private Socket socket;
  private BufferedReader in;
  private PrintWriter out;
  public Server()
  {
  try
  {
  ss = new ServerSocket(10000);
  while (true)
  {
  socket = ss.accept();
  in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  out = new PrintWriter(socket.getOutputStream(),true);
  String line = in.readLine();
  out.println("you input is :" + line);
  out.close();
  in.close();
  socket.close();
  }
  ss.close();
  }
  catch (IOException e)
  {}
  }
  public static void main(String[] args)
  {
  new Server();
  }
  }
  這個(gè)程序建立了一個(gè)服務(wù)器,它一直監(jiān)聽10000端口,等待用戶連接。在建立連接后給客戶端返回一段信息,然后結(jié)束會(huì)話。這個(gè)程序一次只能接受一個(gè)客戶連接。
  {建立客戶端}
  import java.io.*;
  import java.net.*;
  public class Client
  {
  Socket socket;
  BufferedReader in;
  PrintWriter out;
  
  public Client()
  {
  try
  {
  socket = new Socket("xxx.xxx.xxx.xxx", 10000);
  in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  out = new PrintWriter(socket.getOutputStream(),true);
  BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
  
  out.println(line.readLine());
  line.close();
  out.close();
  in.close();
  socket.close();
  }
  catch (IOException e)
  {}
  }
  public static void main(String[] args)
  {
  new Client();
  }
  }
  這個(gè)客戶端連接到地址為xxx.xxx.xxx.xxx的服務(wù)器,端口為10000,并從鍵盤輸入一行信息,發(fā)送到服務(wù)器,然后接受服務(wù)器的返回信息,最后結(jié)束會(huì)話。
  第二步 多個(gè)客戶同時(shí)連接
  在實(shí)際的網(wǎng)絡(luò)環(huán)境里,同一時(shí)間只對(duì)一個(gè)用戶服務(wù)是不可行的。一個(gè)優(yōu)秀的網(wǎng)絡(luò)服務(wù)程序除了能處理用戶的輸入信息,還必須能夠同時(shí)響應(yīng)多個(gè)客戶端的連接請(qǐng)求。在java中,實(shí)現(xiàn)以上功能特點(diǎn)是非常輕易的。
  設(shè)計(jì)原理:
  主程序監(jiān)聽一端口,等待客戶接入;同時(shí)構(gòu)造一個(gè)線程類,預(yù)備接管會(huì)話。當(dāng)一個(gè)Socket會(huì)話產(chǎn)生后,將這個(gè)會(huì)話交給線程處理,然后主程序繼續(xù)監(jiān)聽。運(yùn)用Thread類或Runnable接口來實(shí)現(xiàn)是不錯(cuò)的辦法。
  {實(shí)現(xiàn)消息共享}
  import java.io.*;
  import java.net.*;
  
  public class Server extends ServerSocket
  {
  private static final int SERVER_PORT = 10000;
  
  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(client.getInputStream(), "GB2312"));
  out = new PrintWriter(client.getOutputStream(), true);
  out.println("--- Welcome ---");
  start();
  }
  
  public void run()
  {
  try
  {
  String line = in.readLine();
  
  while (!line.equals("bye"))
  {
  String msg = createMessage(line);
  out.println(msg);
  line = in.readLine();
  }
  out.println("--- See you, bye! ---");
  client.close();
  }
  catch (IOException e)
  {}
  }
  private String createMessage(String line)
  {
  xxxxxxxxx;
  }
  }
  public static void main(String[] args) throws IOException
  {
  new Server();
  }
  }
  這個(gè)程序監(jiān)聽10000端口,并將接入交給CreateServerThread線程運(yùn)行。CreateServerThread線程接受輸入,并將輸入回應(yīng)客戶,直到客戶輸入"bye",線程結(jié)束。我們可以在createMessage方法中,對(duì)輸入進(jìn)行處理,并產(chǎn)生結(jié)果,然后把結(jié)果返回給客戶。
  第三步 實(shí)現(xiàn)信息共享:在Socket上的實(shí)時(shí)交流
  網(wǎng)絡(luò)的偉大之一也是信息共享,Server可以主動(dòng)向所有Client廣播消息,同時(shí)Client也可以向其它Client發(fā)布消息。下面看看如何開發(fā)一個(gè)可以實(shí)時(shí)傳遞消息的程序。
  設(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 connection/015/012";
  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 < Threader.size(); i++)
  {
  CreateServerThread client = (CreateServerThread)Threader.get(i);
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 鹰潭市| 中阳县| 永清县| 普陀区| 莱芜市| 谷城县| 嘉鱼县| 平湖市| 兰坪| 万盛区| 临泉县| 阜城县| 军事| 湖南省| 疏勒县| 嘉善县| 淳安县| 兴和县| 修武县| 鄂温| 望都县| 庆元县| 日照市| 三门峡市| 仁怀市| 惠水县| 清丰县| 聂拉木县| 那坡县| 凉城县| 界首市| 鄢陵县| 九寨沟县| 池州市| 吉安市| 巴林右旗| 丰宁| 海南省| 万载县| 容城县| 建德市|