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 ,所有技术的更新和不断发展都是背后业务在驱动。人们追求高效率,高速度,高质量的通信,促使开源框架日新月异。关于开源通信框架以后再讲,和大家一起学习,谢谢大家观看!
时间: 2024-12-14 18:13:05