继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

知识输出之Socket

Naison
关注TA
已关注
手记 5
粉丝 2
获赞 9

通信是基础功能,web应用最基础的就是socket,因为一切通信都是建立在socket上的。

参考文章:https://blog.csdn.net/weixin_41648325/article/details/79412158

https://img1.mukewang.com/5cafe59d0001b05705420476.jpg

socket本身是全双工的。我们的通信都是封装这个sokcet,例如netty。

http://www.blogjava.net/supercrsky/articles/247449.html这篇文章非常好,

总结起来就是网络请求会开启两个通道,inputStream和outputStream,而客户端的inputStream对应服务端的outputStream, 客户端的outputStream对应服务端的inputStream,

基本步骤都是准备请求参数,请求uri,然后使用HttpUrlConnection进行链接

URL realUrl = new URL(fullUrl);
URLConnection urlConn = proxy == null ? realUrl.openConnection() : realUrl.openConnection(proxy);

if (!(urlConn instanceof HttpURLConnection)) { // 只能支持http/https
    throw new HttpClientException("不支持的协议类型" + realUrl.getProtocol());
}
HttpURLConnection conn = (HttpURLConnection) urlConn;

// 添加header
for (Entry<String, Object> e : headers.entrySet()) {
    conn.setRequestProperty(e.getKey(), String.valueOf(e.getValue()));
}
// 添加cookie
if (null != cookie) {
    conn.setRequestProperty("Cookie", cookieString.toString());
}

// 设置连接参数
conn.setRequestMethod(method.toString());
if (HttpMethod.POST == method || HttpMethod.PUT == method) {
    // 只能在有OutputStream的请求时才能设置为true
    conn.setDoOutput(true);
}
conn.setDoInput(true);
conn.setConnectTimeout(connTimeout);
conn.setReadTimeout(soTimeout);
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(autoRedirect);
conn.connect();// 在调用此方法前,必需完成conn的各种set配置

// 如果是POST/PUT请求,这里提交数据
if (HttpMethod.POST == method || HttpMethod.PUT == method) {
    OutputStream out = conn.getOutputStream();
    if (null != content) {
        out.write(content);
    }
    out.flush();
}

// 读取返回数据,由于采用的短连接方式,直接读到EOF即可
code = String.valueOf(conn.getResponseCode());
// 提前创建HttpResult,即使404也能返回header内容
result = new HttpResult(cmd.toString(), conn.getResponseCode(), conn.getHeaderFields(), charset);
// 读取返回数据

InputStream is;
if (result.getStatusCode() >= 400) {
    // 当请求回包大于等于400,即请求错误时,获取错误输入流
    is = conn.getErrorStream();
} else {
    // 正常情况下,获取输入流
    is = conn.getInputStream();
}
if (is != null) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    int r;
    while ((r = is.read()) != -1) {
        baos.write(r);
    }
    // 设置接收到的content数据
    result.setContent(baos.toByteArray());
}

fd,即file descriptor,文件描述符

参见文章:https://blog.csdn.net/cywosp/article/details/38965239

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP