Java TCP网络编程:从Socket基础到文件上传实战
本文深入讲解Java中的TCP网络编程技术。通过解析IP、端口、Socket等核心概念,结合具体代码实例,演示如何使用Socket和ServerSocket建立连接并进行数据交换,同时提供文件上传的完整实战案例,涵盖从本地读取文件、网络传输到服务器保存的全流程。
核心概念与通信机制
Java网络编程主要基于TCP协议进行可靠的数据传输。理解以下关键要素是编写正确程序的前提:
- IP地址:标识网络上设备的逻辑地址,用于定位目标主机。
- TCP协议(传输控制协议):面向连接的协议,类似电话通话,需先建立连接再传输数据,确保数据准确且有序到达。
- UDP协议:无连接协议,不保证可靠性但速度较快,适用于视频流等场景。
- 端口(Port):应用程序在主机上的入口,IP与端口组合可唯一标识一个进程。
- 套接字(Socket):通信端点的抽象,Java中通过
java.net.Socket(客户端)和java.net.ServerSocket(服务端)实现。
基础通信实现步骤
TCP通信的基本流程包含客户端发起请求和服务端响应两个部分。
第1步:客户端发送数据
客户端通过创建Socket对象连接到指定IP和端口,获取输出流写入数据,并通过输入流接收服务端的回应。操作完成后需关闭资源。
public static void main(String[] args) throws IOException {
//1.创建客户端Socket,绑定服务器IP和端口
Socket socket = new Socket("127.0.0.1", 8888);
//2.获取网络字节输出流
OutputStream os = socket.getOutputStream();
//3.发送数据给服务器
os.write("你好服务器".getBytes());
//4.获取网络字节输入流
InputStream is = socket.getInputStream();
//5.读取服务器回写数据
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes, 0, len));
//6.关闭资源
socket.close();
}
第2步:服务端接收与回写数据
服务端首先创建ServerSocket监听指定端口,调用accept()阻塞等待客户端连接。连接建立后,分别获取输入流读取客户端数据,通过输出流回写响应信息。
public static void main(String[] args) throws IOException {
//1.创建服务器ServerSocket,指定端口号
ServerSocket server = new ServerSocket(8888);
//2.侦听并接受连接,返回Socket对象
Socket socket = server.accept();
//3.获取网络字节输入流读取客户端数据
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes, 0, len));
//4.获取网络字节输出流并回写数据
OutputStream os = socket.getOutputStream();
os.write("收到谢谢".getBytes());
//5.释放资源
socket.close();
server.close();
}
实战练习:文件上传功能
基于上述基础,下面演示如何实现文件上传。主要逻辑为:客户端以流的方式循环读取本地文件并发送到服务端,服务端接收数据并写入本地磁盘。需注意在发送完所有数据后调用shutdownOutput()标记结束,否则服务端read()将一直阻塞等待。
第3步:客户端上传文件
使用FileInputStream读取本地文件,循环写入Socket的输出流,最后通过getInputStream()读取服务器确认信息。
public static void main(String[] args) throws IOException {
//1.创建本地文件输入流,指向源文件
FileInputStream fis = new FileInputStream("c:\\1.jpg");
//2.创建客户端Socket连接服务器
Socket socket = new Socket("127.0.0.1", 8888);
//3.获取网络输出流
OutputStream os = socket.getOutputStream();
//4.循环读取文件内容并发送给服务器
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fis.read(bytes)) != -1) {
os.write(bytes, 0, len);
}
//重要:发送完文件后,禁用输出流以通知服务器数据传输结束
socket.shutdownOutput();
//6.获取网络输入流,读取服务端回写的反馈
InputStream is = socket.getInputStream();
while ((len = is.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, len));
}
//8.释放资源
fis.close();
socket.close();
}
第4步:服务端保存文件
服务端接收数据前需确保目标目录存在。循环读取网络输入流并将数据写入FileOutputStream,直到读取完毕(由客户端的shutdownOutput()触发流结束)。成功后回写提示信息。
public static void main(String[] args) throws IOException {
//1.创建服务器Socket监听端口
ServerSocket server = new ServerSocket(8888);
//2.获取客户端Socket连接
Socket socket = server.accept();
//3.获取网络输入流读取上传的文件数据
InputStream is = socket.getInputStream();
//4.判断目标文件夹是否存在,不存在则创建
File file = new File("d:\\upload");
if (!file.exists()) {
file.mkdirs();
}
//5.创建本地文件输出流,绑定保存路径
FileOutputStream fos = new FileOutputStream(file + "\\1.jpg");
//6.循环读取网络数据并保存到本地硬盘
int len = 0;
byte[] bytes = new byte[1024];
while ((len = is.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
//8-9.获取输出流并给客户端回写成功信息
socket.getOutputStream().write("上传成功".getBytes());
//10.释放资源
fos.close();
socket.close();
server.close();
}
以上就是Java TCP网络编程及文件上传功能的详细内容,更多关于Java网络开发实战的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









