亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

知識輸出之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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消