副标题#e#
这整个过程可以用一句话概括:机器 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();
//调用服务类生成商品
#p#副标题#e#
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();
}