## Java专题十二:网络
[TOC]
### 12.1.套接字
- `Socket`: 客户端套接字
- `ServerSocket`: 服务器端套接字
> Linux中Socket编程:[http://www.man7.org/linux/man-pages/man2/socket.2.html](http://www.man7.org/linux/man-pages/man2/socket.2.html)
<table >
<tr>
<th style="width:70%">SOCKET_API</th>
<th style="width:30%">DESCRIPTION</th>
</tr>
<tr>
<td>int socket(int domain, int type, int protocol);</td>
<td>create an endpoint for communication</td>
</tr>
<tr>
<td>int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); </td>
<td>accept a connection on a socket</td>
</tr>
<tr>
<td> int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);</td>
<td>initiate a connection on a socket</td>
</tr>
<tr>
<td> int bind(int sockfd, const struct sockaddr *add, socklen_t addrlen);</td>
<td>bind a name to a socket </td>
</tr>
<tr>
<td>int listen(int sockfd, int backlog);</td>
<td> listen for connections on a socket
</td>
</tr>
<tr>
<td>ssize_t send(int sockfd, const void *buf, size_t len, int flags); </td>
<td>send a message on a socket </td>
</tr>
<tr>
<td>ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen); </td>
<td>send a message on a socket </td>
</tr>
<tr>
<td>ssize_t recv(int sockfd, const void *buf, size_t len, int flags);</td>
<td>receive a message on a socket</td>
</tr>
<tr>
<td>ssize_t recvfrom(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);</td>
<td>receive a message on a socket</td>
</tr>
<tr>
<td>ssize_t read(int fd, void *buf, size_t count); </td>
<td>read from a file descriptor</td>
</tr>
<tr>
<td>ssize_t write(int fd, const void *buf, size_t count); </td>
<td>write to a file descriptor</td>
</tr>
<tr>
<td>int close(int fd); </td>
<td>close a file descriptor</td>
</tr>
</table>
#### 12.1.1 服务器端(`java.net.ServerSocket`)
* 创建Socket(`new ServerSocket()`)
* 绑定端口(`bind(SocketAddress endpoint)`)
* 监听端口(`accept()`)
* 等待客户端连接
* 接收和发送数据(`getInputStream()、getOutputStream()`)
* 关闭Socket(`close()`)
#### 12.1.2客户端(`java.net.Socket`)
* 创建Socket(`Socket()`)
* 发起连接(`connect(SocketAddress endpoint)`)
* 发送和接收数据(`getOutputStream()、getInputStream()`)
* 关闭Socket(`close()`)
![](https://img.kancloud.cn/4d/29/4d2919823ccbd00a9de874a3cf0e7044_280x354.png)
### 12.2.高级API
java.net 包中的许多类可以提供更加高级的抽象,允许方便地访问网络上的资源。
- `URI`: 表示统一资源标识符(URI)引用
- `URL`: 表示统一资源定位器,即指向万维网上“资源”的指针
- `URLConnection`: 表示应用程序和URL之间的通信链接
- `HttpURLConnection`: 支持HTTP特定功能的URLConnection,规范见[http://www.w3.org/pub/www/Protocols/](http://www.w3.org/pub/www/Protocols)
例:从网络上下载文件并保存到本地,详细参考[NetTools](https://github.com/15045120/git-docs/blob/master/tools/NetTools.java)
```
NetTools.download("https://dl.google.com/android/repository/platform-tools-latest-windows.zip","");
```
```
public static boolean download(String url, String saveDir)
throws URISyntaxException, IOException {
// get download file name
String fileName = url.substring(url.indexOf('/'));
if (saveDir == null || saveDir.trim().equals("")){
saveDir = "";
}else{
File out = new File(saveDir);
if (!out.exists() || !out.isDirectory()){
throw new FileNotFoundException();
}
}
// open connection
URI uri = new URI(url);
URL url0 = uri.toURL();
HttpURLConnection conn = (HttpURLConnection)url0.openConnection();
conn.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36");
conn.connect();
// response is ok
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK){
InputStream is = conn.getInputStream();
File file = new File(saveDir, fileName);
FileOutputStream fos = new FileOutputStream(new File("platform-tools-latest-windows.zip"));
byte[] buf = new byte[1024];
int readCount;
while((readCount = is.read(buf)) > 0){
fos.write(buf, 0, readCount);
}
is.close();
fos.close();
return true;
}
return false;
}
```
- JavaCook
- Java专题零:类的继承
- Java专题一:数据类型
- Java专题二:相等与比较
- Java专题三:集合
- Java专题四:异常
- Java专题五:遍历与迭代
- Java专题六:运算符
- Java专题七:正则表达式
- Java专题八:泛型
- Java专题九:反射
- Java专题九(1):反射
- Java专题九(2):动态代理
- Java专题十:日期与时间
- Java专题十一:IO与NIO
- Java专题十一(1):IO
- Java专题十一(2):NIO
- Java专题十二:网络
- Java专题十三:并发编程
- Java专题十三(1):线程与线程池
- Java专题十三(2):线程安全与同步
- Java专题十三(3):内存模型、volatile、ThreadLocal
- Java专题十四:JDBC
- Java专题十五:日志
- Java专题十六:定时任务
- Java专题十七:JavaMail
- Java专题十八:注解
- Java专题十九:浅拷贝与深拷贝
- Java专题二十:设计模式
- Java专题二十一:序列化与反序列化
- 附加专题一:MySQL
- MySQL专题零:简介
- MySQL专题一:安装与连接
- MySQL专题二:DDL与DML语法
- MySQL专题三:工作原理
- MySQL专题四:InnoDB存储引擎
- MySQL专题五:sql优化
- MySQL专题六:数据类型
- 附加专题二:Mybatis
- Mybatis专题零:简介
- Mybatis专题一:配置文件
- Mybatis专题二:映射文件
- Mybatis专题三:动态SQL
- Mybatis专题四:源码解析
- 附加专题三:Web编程
- Web专题零:HTTP协议
- Web专题一:Servlet
- Web专题二:Cookie与Session
- 附加专题四:Redis
- Redis专题一:数据类型
- Redis专题二:事务
- Redis专题三:key的过期
- Redis专题四:消息队列
- Redis专题五:持久化