11.网络编程
- 网络编程入门
- 软件结构
C/S结构(Client:Server)
B/S结构(Browser:Server)
- 网络通信协议
计算机可以分为5层或者7层
- 协议分类
TCP(传输控制协议):类似打电话,对方只有接收到电话,才能传达信息。可靠
UDP(用户数据协议):类似一种广播性质,不管有没有接收到信息,我只管广播。不可靠。
- 网络编程三要素
1).协议:通信规则。
2).IP地址:互联网协议地址,类似我们现实生活中的身份证。
IP地址分类:IPv4、IPV6
3).端口号:一台计算机在网络当中进行通信时,一个应用程序与另一个程序的数据连接出入口。
端口号范围:0-65536
常用端口号:HTTP-80
Https-443
Tomcate-8080
mysql:3306
- 客户端/服务器通信
a). 客户端-java.net.Socket
构造方法:pulic socket(String host,int port):第一个参数是服务器的IP地址,第二个参数是服务器的端口号。
常用方法:1). public OutputStream getOutputStream():获取字节输出流,用来写数据,也就是发送数据。
2). public InputStream getInputStream():获取字节输入流,用来读数据,也就是接收数据。
3). public void close():关闭Socket。
4).public void shutdownOutput():关闭输出流,并且发送结束标记,但是连接不断。
使用步骤:1). 创建Socket对象,指定IP地址和端口号。只要创建了对象,就算是连接建立。
2). 获取字节输出流,调用getOutputStream方法,然后再调用write方法。(发送)
3). 获取字节输入流,调用getInputStream方法,然后再调用read方法。(接收
4). 关闭连接。(里面的IO流也会跟着关闭)
b). 服务器-java.net.ServerSocket
构造方法:public ServerSocket(int port):只有一个端口号参数
常用方法:1). public Socket accept():获取一个与客户端对应的连接。这就是获取图中的Socket'(撇儿)
2). public void close():关闭服务器连接。
使用步骤:1). 创建一个ServerSocket对象,指定端口号。
2). 调用accept方法,获取一个与客户端对应的Socket'。
3). 通过getInputStream获取输入流,读取客户端发送来的数据。
4). 通过getOutputStream获取输出流,给客户端发送数据。
5).关闭。(先关闭socket,再关闭ServerSocket)
注意:accept方法会阻塞,直到有客户端连接为止,才能返回。
c). 传输问题(有图)
客户端给服务器发送完数据,但是服务器不知道客户端是否发送完,所以一直处于等待状态。服务器一直没有收到EXO结束标记。
解决方法:
客户端调用shutdownOutput()方法。作用:关闭字节流输出,并且发送EXO技术标但是连续不断。
- 文件上传
- 文件上传过程分析(有图)
1. 创建一个Socket对象,建立连接。
2. 获取一个网络的输出流,用来发送数据。socket.getOutputStream()
3. 创建一个本地的输入流,用来读取文件。new FileInputStream("图片.jpg")
4. 将byte[]字节数组的数据发送到网络中。本地read,网络write,循环while
5. 发送完成之后,调用shutdownOutput方法。
6. 读取服务器的响应数据:上传成功。
7. 关闭。
- 代码实现
客户端
服务器
1. 创建ServerSocket对象。
2. 调用accept()方法接收一个客户端连接(图中的Socket'撇儿)
3. 获取网络的输入流,用来读客户端发送来的图片数据:getInputStream
4. 创建本地的输出流,用来写图片文件:new FileOutputStream("图片.jpg");
5. read/write/while
6. 给客户端发送一个结果消息:上传成功。
7. 关闭。
- 怎么解决多个客户端同时上传文件?(优化)
解决办法:多线程服务器(有图)
代码实现:
又一问题:只有一个图片,因为FileOutStream都是同一个对象
继续优化:用线程池或者lamda
代码实现:
- 通过浏览器访问自己的服务器
分析浏览器和服务器:(有图解)