【王道Java】网络编程实战详解三【TCP完结】

上进小菜猪 发表于 2022/05/16 18:50:00 2022/05/16
【摘要】 一,前言上篇文章,写了通信协议,服务端与客户端的文本传输原理。这篇写一下文件的传输原理。 二,文件传输了解了服务端与客户端的文本传输原理,我们继续进阶到文件传输的原理。我这里写了俩个文件为:Tcpwen01.java和Tcpwen02.java,分别是服务端与客户端。我们这里已传输照片为例子。 2.1,Tcpwen02.java客户端这里为了方便直接抛出异常了。1,首先看到是创建一个soc...

一,前言

上篇文章,写了通信协议,服务端与客户端的文本传输原理。
这篇写一下文件的传输原理。

二,文件传输

了解了服务端与客户端的文本传输原理,我们继续进阶到文件传输的原理。
我这里写了俩个文件为:
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传输

下集预告_UDP传输原理。
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。