Java Socket底层采用TCP/IP协议通信,通信细节被封装,我们仅仅需要指定IP、端口,便能轻易地创建TCP或UDP连接,进行网络通信。数据的读写,可以使用我们熟悉的stream进行操作。
TCP通信中,服务端与客户端是一对多的关系,如下图
Client发起连接请求后,Server端响应并创建一个Socket实例,与Client端一对一通信。通信完毕后,Client端与Server端的Socket实例各自关闭连接并销毁,此次通信结束。
发起连接的三次握手和关闭连接的四次挥手过程暂且不表,后续文章详细介绍。下面看具体代码
服务端代码
package com.coshaho.learn.socket; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /** * SocketServer.java Create on 2017年12月16日 下午11:42:03 * 类功能说明: socket服务端 * @Author coshaho */ public class SocketServer { public static void main(String[] args) throws Exception { // 创建服务端 ServerSocket server = new ServerSocket(10000); // 服务端阻塞式监听客户端连接请求 // 接收到连接请求,则创建一个socket实例,与客户端通信 Socket client = server.accept(); // 获取InputStream读取数据 InputStream in = client.getInputStream(); byte[] b = new byte[1024]; // 客户端关闭输出流后服务端会读取到-1标志 while(-1 != in.read(b)) { System.out.println(new String(b)); } // 获取OutputStream输出数据 OutputStream out = client.getOutputStream(); out.write("hello, client".getBytes()); // 输出结束,关闭输出流 client.shutdownOutput(); System.out.println("Server close. " + System.currentTimeMillis()); server.close(); } }
客户端代码
package com.coshaho.learn.socket; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** * SocketClient.java Create on 2017年12月16日 下午11:42:53 * 类功能说明: socket客户端 * @Author coshaho */ public class SocketClient { public static void main(String[] args) throws Exception { // 请求连接服务端,握手成功,返回Socket实例 Socket client = new Socket("127.0.0.1",10000); // 获取输入输出流,读写数据(与服务端数据读写操作相同) InputStream in = client.getInputStream(); OutputStream out = client.getOutputStream(); out.write("hello, server".getBytes()); client.shutdownOutput(); byte[] b = new byte[1024]; while(-1 != in.read(b)) { System.out.println(new String(b)); } System.out.println("Client close. " + System.currentTimeMillis()); client.close(); } }