系列文章目录
Java基础篇之jdk、jre环境变量的配置
第一章 - Java基本语法
第六章 - Java集合
第七章 - Java网络编程(一)
前言
因网络编程内容较多且叙述较为繁琐,所以拆分多个章节记录,本篇继续介绍网络编程相关知识点以及相关案例。
一、网络文件上传
要求:
- 编写一个服务端,和一个客户端
- 服务端在8888端口监听
- 客户端连接到服务端,发送一张图片d:\svn.png
- 服务端接收到客户端发送的图片,保存到src下,发送“收到图片”再退出
- 客户端接收到服务端发送的“收到图片”,再退出
- 说明:使用BufferedInputStream 和 BufferedOutputStream字节流
解决思路:
- 首先按要求在D盘根目录创建一张图片,名命为svn.png
- 通过文件输入流读取磁盘上的文件,用字节数组接收
- 通过socket获取到输出流, 将bytes数据发送给服务端
- 服务端通过socket获取输入流,接收客户端发送的bytes数组,然后将bytes数组写入指定路径src\svn.png
- 使用字符输出流向客户端回复“收到图片”
- 客户端使用字符输入流读取服务端回复的数据
图文详解:
具体代码实现:
// 客户端代码实现
// 1.客户端连接服务端8888端口,得到Socket对象
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
// 2.创建读取磁盘文件的输入流
String filePath = "d:\\svn.png";
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
// bytes就是filePath对应的字节数组
byte[] bytes = StreamUtils.streamToByteArray(bis);
// 3.通过socket获取到输出流, 将bytes数据发送给服务端
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
// 4.将文件对应的字节数组内容写入到数据通道
bos.write(bytes);
bis.close();
// 5.设置结束标记
socket.shutdownOutput();
// 6.接收服务端写入数据管道的数据(字符流)
InputStream inputStream = socket.getInputStream();
String s = StreamUtils.streamToString(inputStream);
System.out.println(s);
// 关闭流和socket
inputStream.close();
bos.close();
socket.close();
// 服务端代码实现
// 1.在本机创建服务端,监听端口8888
ServerSocket serverSocket = new ServerSocket(8888);
// 2.等待连接
System.out.println("等待客户端连接...");
Socket socket = serverSocket.accept();
// 3.读取客户端发送的数据
// 通过socket得到输入流
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] bytes = StreamUtils.streamToByteArray(bis);
// 4.将得到的bytes写入到指定路径就得到一个文件了
String destFilePath = "src\\qie.png";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
bos.write(bytes);
bos.close();
// 5.向客户端回复“收到图片”(使用字符流)
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("收到图片");
// 6.将数据刷新入管道
writer.flush();
// 7.设置写入结束标记
socket.shutdownOutput();
// 8.关闭其他资源
writer.close();
bis.close();
socket.close();
serverSocket.close();
程序运行结果:
- 服务端将图片写入src目录下并回复客户端:“收到图片”:
- 客户端接收服务端回复的数据,并在控制台打印出来:
二、netstat
1.netstat指令
1.1 netstat -an可以查看当前主机网络情况,包括端口监听情况和网络连接情况
1.2 netstat - an | more 可以分页显示
1.3 要求在dos控制台下执行(win + r)
1.4 说明:
- Listening表示某个端口在监听
- 如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息
- 可以输入ctrl + c退出指令
- 以管理员身份运行dos命令,输入netstat -anb可以看到该地址对应运行的程序是什么
1.5 当本机运行一个本机8888端口正在监听,那么dos命令,也会显示
- idea运行java程序:
cmd输入netstat -an | more命令:
注意:ESTABLISHED表示已经建里连接,外部地址一般指客户端的IP,很多情况下这个IP不会是本机的IP,往往是另一台主机的IP
1.6 以管理员身份运行,输入netstat -anb可以展示ip对应的具体运行的程序
总结
本篇先介客户端与服务端文件之间的传输以及netstat命令的基本使用,更多内容后续更新。