Java網絡編程【Socket服務端和客戶端】
阿新 • • 發佈:2017-05-09
rgs .net aio highlight 如果 org author oid try
Socket 編程大家都不陌生,Java 學習中必學的部分,也是 Java網絡編程核心內容之一。Java 網絡編程又包括 TCP、UDP,URL 等模塊。TCP 對應 Socket模塊,UDP 對應 DatagramPacket 模塊。URL 對應 URL 模塊。其中 TCP 和 UDP 是網絡傳輸協議,TCP 是數據流傳輸協議,UDP 是數據包傳輸協議。兩者之間的異同就不在這裏說了,推薦一本入門書籍 《TCPIP入門經典》。我們開始 Socket 服務端和客戶端編程吧。
一、Socket 服務端
package www.rockcode.com.tnetty.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * @author xums * SocketServer * TODO * 2017年5月4日-上午11:07:49 */ public class SocketServer { public static void main(String[] args) { SocketServer server = new SocektServer();
server.init(); } public void init(){ ServerSocket serverSocket = null; Socket socket = null; BufferedReader br = null; PrintWriter pw = null; try { serverSocket = new ServerSocket(9999); socket = serverSocket.accept(); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); pw = new PrintWriter(socket.getOutputStream()); String msg = br.readLine(); while(null!=msg){ System.out.println("收到消息:"+msg); msg = br.readLine(); } } catch (IOException e) { e.printStackTrace(); }finally{ if(null!=pw){ pw.close(); } if(null!=br){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if(null!=socket){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
二、Socket 客戶端
package www.rockcode.com.tnetty.client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.Socket; /** * @author xums * SocketClient * TODO * 2017年5月4日-上午10:47:20 */ public class SocketClient { public static void main(String[] args) { SocketClient client = new SocketClient(); client.init(); } public void init(){ Socket socket = null; BufferedReader br = null; PrintWriter pw = null; try { socket = new Socket(); socket.connect(new InetSocketAddress(9999), 5000); socket.setKeepAlive(true);//默認false if(socket.isConnected()){ br = new BufferedReader(new InputStreamReader(System.in)); pw = new PrintWriter(socket.getOutputStream(),true);//如果第二個參數不選擇 true 或者 只選一個參數,那麽發完消息要記得 flush() String msg = ""; while(true){ boolean alive = socket.getKeepAlive();//判斷服務端是否在線 if(!alive){ throw new Exception("服務端不在線!"); }else{ msg = br.readLine(); if(null!=msg){ System.out.println("發送消息:"+msg); pw.println(msg); //pw.flush(); } } } } } catch (Exception e) { System.out.println(e.getMessage()); }finally{ if(null!=pw){ pw.close(); } if(null!=br){ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if(null!=socket){ try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
Socket 編程是必須熟悉的知識點,即使現在有不少的開源通信框架出現,例如 Mina、Netty、Cindy 等等。現在商業上用的最多還是 Netty,從最原始的 Java IO 到 Java NIO,再到 Java AIO,再到 Netty 等。其底層離不開 Socket ,所有技術的更新和不斷發展都是背後業務在驅動。人們追求高效率,高速度,高質量的通信,促使開源框架日新月異。關於開源通信框架以後再講,和大家一起學習,謝謝大家觀看!
Java網絡編程【Socket服務端和客戶端】