为了账号安全,请及时绑定邮箱和手机立即绑定

知识输出之Socket

标签:
Java

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

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

https://img1.sycdn.imooc.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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
2
获赞与收藏
9

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消