这整个过程可以用一句话概括:机器 A 通过网络与机器B建立连接,A 发送一些参数给 B,B 执行某个过程,并把结果返回给 A。
“在写代码之前,先说一个前置背景,假设我们有一个商品类:
- public class Product implements Serializable {
- private Integer id;
- private String name;
- public Product(Integer id, String name) {
- this.id = id;
- this.name = name;
- }
- //toString()
- //get set 方法
- }
有一个商品服务接口:
- public interface IProductService {
- Product getProductById(Integer id);
- }
服务端有商品服务接口的实现类:
- public class ProductServiceImpl implements IProductService {
- @Override
- public Product getProductById(Integer id) {
- //实际上这里应该去查询数据库获得数据,下面简化了
- return new Product(id, "手机");
- }
- }
下面我们通过客户端发送一个商品 id 到服务端,服务端获得 id 后通过商品服务类获取商品信息,返回给客户端:
- public class Client {
- public static void main(String[] args) throws Exception {
- //建立Socket
- Socket socket = new Socket("127.0.0.1", 8888);
- //获取输出流
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- DataOutputStream dos = new DataOutputStream(baos);
- //把商品Id通过网络传到服务端
- dos.writeInt(123);
- socket.getOutputStream().write(baos.toByteArray());
- socket.getOutputStream().flush();
- //读取服务端返回的商品信息
- DataInputStream dis = new DataInputStream(socket.getInputStream());
- Integer id = dis.readInt(); //商品id
- String name = dis.readUTF(); //商品名称
- Product product = new Product(id, name);//通过服务端返回的商品信息生成商品
- System.out.println(product);
- //关闭流资源为了方便阅读,没有做try-catch处理
- dos.close();
- baos.close();
- socket.close();
- }
- }
- public class Server {
- private static boolean running = true;
- public static void main(String[] args) throws Exception {
- //建立服务端Socket
- ServerSocket ss = new ServerSocket(8888);
- //不断监听,处理客户端请求
- while (running) {
- Socket socket = ss.accept();
- process(socket);
- socket.close();
- }
- ss.close();
- }
- private static void process(Socket socket) throws Exception {
- InputStream is = socket.getInputStream();
- OutputStream os = socket.getOutputStream();
- DataInputStream dis = new DataInputStream(is);
- DataOutputStream dos = new DataOutputStream(os);
- //读取客户端发过来的id
- Integer id = dis.readInt();
- //调用服务类生成商品
- IProductService service = new ProductServiceImpl();
- Product product = service.getProductById(id);
- //把商品的信息写回给客户端
- dos.writeInt(id);
- dos.writeUTF(product.getName());
- dos.flush();
- dos.close();
- dis.close();
- os.close();
- is.close();
- }