一、三个接口
1.client端
1.创建连接。
2.发送数据并等待响应
3.关闭连接。
public interface TransportClient {
void connect(Peer peer);//连接到网络端点 Peer类(手写RPC---②协议类)
InputStream write(InputStream data);
void close();
}
2.server端
- 1.启动、监听
- 2.接受请求 接受到的请求只是一个InputStream,
也就是一个byte数据流,得给它抽象成一个handler,
从而让用这个网络模块的人去实现。
于是就有了第三个接口 —>RequestHandler接口 - 3.关闭监听
public interface TransportServer {
//RequestHandler什么时候传给Server 应该在初始化时
void init(int port,RequestHandler handler);
void start();
void stop();
}
3.RequestHandler
处理网络请求的handler
public interface RequestHandler {
//输入revice , 输出数据的通道toResp
void onRequest(InputStream recive, OutputStream toResp);
}
二、 clien实现类
public class HTTPTransportClient implements TransportClient {
private String url;
@Override
//连接网络 字符串拼接赋值给url
public void connect(Peer peer) {
this.url = "http://" + peer.getHost() + ":" + peer.getPort();
}
@Override
public InputStream write(InputStream data) {
//用jdk自带的 http连接方法
try {
HttpURLConnection httpConn =(HttpURLConnection) new URL(url).openConnection();
httpConn.setDoOutput(true);//输出数据
httpConn.setDoInput(true);//读取数据
httpConn.setUseCaches(false);//不区分大小写
httpConn.setRequestMethod("POST");//请求方法 post
httpConn.connect();//连接
//连接成功后,需要把参数data数据 发送给server
IOUtils.copy(data,httpConn.getOutputStream());//使用的是IO工具包的copy方法
//获取http的code信息 成功或者失败
int responseCode = httpConn.getResponseCode();
if(responseCode == HttpURLConnection.HTTP_OK){
//HTTP_OK 是 200
// 获取与此URL连接的资源的输入流。通过该方法返回的InputStream对象,可以读取与此URL连接的资源的数据。
return httpConn.getInputStream();
}else
return httpConn.getErrorStream();
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
@Override
public void close() {
}
}