日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java Socket

發布時間:2025/7/14 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Socket 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一步 充分理解Socket

  1.什么是socket

  所謂socket通常也稱作"套接字",用于描述IP地址和端口,是一個通信鏈的句柄。應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。

  Socket和ServerSocket類庫位于java.net包中。ServerSocket用于服務器端,Socket是建立網絡連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。對于一個網絡連接來說,套接字是平等的,并沒有差別,不因為在服務器端或在客戶端而產生不同級別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。

  重要的Socket API:

  java.net.Socket繼承于java.lang.Object,有八個構造器,其方法并不多,下面介紹使用最頻繁的三個方法:


  . Accept方法用于產生"阻塞",直到接受到一個連接,并且返回一個客戶端的Socket對象實例。"阻塞"是一個術語,它使程序運行暫時"停留"在這個地方,直到一個會話產生,然后程序繼續;通常"阻塞"是由循環產生的。

  . getInputStream方法獲得網絡連接輸入,同時返回一個IutputStream對象實例,。

  . getOutputStream方法連接的另一端將得到輸入,同時返回一個OutputStream對象實例。

  注意:其中getInputStream和getOutputStream方法均會產生一個IOException,它必須被捕獲,因為它們返回的流對象,通常都會被另一個流對象使用。

  2.如何開發一個Server-Client模型的程序

  開發原理:

  服務器,使用ServerSocket監聽指定的端口,端口可以隨意指定(由于1024以下的端口通常屬于保留端口,在一些操作系統中不可以隨意使用,所以建議使用大于1024的端口),等待客戶連接請求,客戶連接后,會話產生;在完成會話后,關閉連接。

  客戶端,使用Socket對網絡上某一個服務器的某一個端口發出連接請求,一旦連接成功,打開會話;會話完成后,關閉Socket。客戶端不需要指定打開的端口,通常臨時的、動態的分配一個1024以上的端口。

  {建立服務器}

Java代碼
  •   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();? ??
  • ??
  •   }? ??
  • ??
  •   }???
  •   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(); } }



      這個程序建立了一個服務器,它一直監聽10000端口,等待用戶連接。在建立連接后給客戶端返回一段信息,然后結束會話。這個程序一次只能接受一個客戶連接。

      {建立客戶端}

    Java代碼
  •   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();? ??
  • ??
  •   }? ??
  • ??
  •   }???
  •   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(); } }



      這個客戶端連接到地址為xxx.xxx.xxx.xxx的服務器,端口為10000,并從鍵盤輸入一行信息,發送到服務器,然后接受服務器的返回信息,最后結束會話。

      第二步 多個客戶同時連接

      在實際的網絡環境里,同一時間只對一個用戶服務是不可行的。一個優秀的網絡服務程序除了能處理用戶的輸入信息,還必須能夠同時響應多個客戶端的連接請求。在java中,實現以上功能特點是非常容易的。

      設計原理:

      主程序監聽一端口,等待客戶接入;同時構造一個線程類,準備接管會話。當一個Socket會話產生后,將這個會話交給線程處理,然后主程序繼續監聽。運用Thread類或Runnable接口來實現是不錯的辦法。

      {實現消息共享}

    Java代碼
  •   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();? ??
  • ??
  •   }? ??
  • ??
  •   }??
  • 總結

    以上是生活随笔為你收集整理的Java Socket的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。