通信是基础功能,web应用最基础的就是socket,因为一切通信都是建立在socket上的。
参考文章:https://blog.csdn.net/weixin_41648325/article/details/79412158
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,文件描述符