莫问天涯路几重,轻衫侧帽且从容。这篇文章主要讲述王道Java网络编程实战详解三TCP完结相关的知识,希望能为你提供帮助。
@[toc]
一,前言上篇文章,写了通信协议,服务端与客户端的文本传输原理。
这篇写一下文件的传输原理。
二,文件传输了解了服务端与客户端的文本传输原理,我们继续进阶到文件传输的原理。
我这里写了俩个文件为:
Tcpwen01.java和Tcpwen02.java,分别是服务端与客户端。
我们这里已传输照片为例子。
2.1,Tcpwen02.java客户端这里为了方便直接抛出异常了。
1,首先看到是创建一个socket链接。
Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),9990);
我使用InetAddress类的getByName的方法,开了端口为9990。
,2,创建一个输出流
OutputStream os =socket.getOutputStream();
3,读取文件
我们需要先准备一个照片,我这里直接在java项目文件夹下,所以绝对路径,直接写了文件名。
FileInputStream fis =new FileInputStream(new File("zhu.jpg"));
文章图片
4,写出文件
写出文件,老套路了,io流。
byte[] buffer = new byte[1024];
int len;
while((len=fis.read(buffer))!=-1)
os.write(buffer,0,len);
5,通知服务器已经传输完毕
我已经传输完了
socket.shutdownOutput();
6,既然是TCP传输,我们写一个确定,传输的信号,发给服务端,
InputStream InputStream =socket.getInputStream();
ByteArrayOutputStream baos =new ByteArrayOutputStream();
7,老套路,再写一个io输出流。
8,记得关闭资源,保持好习惯。
baos.close();
fis.close();
os.close();
socket.close();
2.2,Tcpwen01.java服务端和上面一样,为了方便直接抛出异常了。
1,老套路,先创建端口
ServerSocket serverSocket =new ServerSocket(9990);
对应上文,创建9990端口。
2,监听客户端链接
Socket socket=serverSocket.accept();
阻塞式监听,会一直等待用户端链接
3,获取输入流
InputStream is =socket.getInputStream();
4,文件输出流。
继续老套路。
文章图片
输出文件名为zhu111.jpg
5,通知客户端,接受完毕
OutputStream os = socket.getOutputStream();
os.write("可以了".getBytes());
6,记得关闭资源,保持好习惯。
fos.close();
is.close();
socket.close();
三,附源码Tcpwen01.java服务端
package tcp02;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Tcpwen01
public static void main(String[] args) throws IOException
//1,创建端口
ServerSocket serverSocket =new ServerSocket(9990);
//2,监听客户端链接
Socket socket=serverSocket.accept();
//阻塞式监听,会一直等待用户端链接
//3,获取输入流
InputStream is =socket.getInputStream();
//4,文件输出
FileOutputStream fos =new FileOutputStream(new File("zhu1111.jpg"));
byte[] buffer=new byte[1024];
int len;
while((len=is.read(buffer))!=-1)
fos.write(buffer,0,len);
//通知客户端,接受完毕
OutputStream os = socket.getOutputStream();
os.write("可以了".getBytes());
//关闭
fos.close();
is.close();
socket.close();
Tcpwen02.java客户端
package tcp02;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Tcpwen02
public static void main(String[] args) throws Exception
//1,创建一个socket链接
Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),9990);
//2,创建一个输出流
OutputStream os =socket.getOutputStream();
//3.读取文件
FileInputStream fis =new FileInputStream(new File("zhu.jpg"));
//4,写出文件
byte[] buffer = new byte[1024];
int len;
while((len=fis.read(buffer))!=-1)
os.write(buffer,0,len);
//通知服务器已经传输完毕
//socket.shutdownInput();
//我已经传输完了
socket.shutdownOutput();
//确定
InputStream InputStream =socket.getInputStream();
ByteArrayOutputStream baos =new ByteArrayOutputStream();
byte[] buffer2=new byte[1024];
int len1;
while((len1=InputStream.read(buffer2))!=-1)
baos.write(buffer,0,len1);
System.out.println(baos.toString());
//5,关闭资源
baos.close();
fis.close();
os.close();
socket.close();
四,下集预告_UDP传输【王道Java网络编程实战详解三TCP完结】下集预告_UDP传输原理。
文章图片
推荐阅读
- Prometheus监控步骤
- Linux系统下 MYSQL数据库中的数据库文件在本机内迁移 (需暂停服务的方式)
- 客快物流大数据项目(六十八)(工作流调度)
- Linux 环境下 javac 编译错误( 编码UTF8的不可映射字符(编码UTF8/GBK的不可映射字符))
- coursera 视频总是缓冲或者无法观看的解决办法(Windows和Linux 系统环境)
- 移动应用的测试策略与测试架构
- PyQt5 中调用MySql接口失败( QSqlDatabase 组件)在Linux环境下如何修改
- 使用HAProxy的ACL实现基于文件后缀名的动静分离
- 运维小白成长记——第十八周