Java:基于TCP协议socket网络编程的文件传送

Java:基于TCP协议socket网络编程的文件传送

先了解一下socket基本概念
socket也叫套接字:

是指在网路中不同主机上的应用进程之间,进行双向通信的端点的抽象。

简单理解就是:

两个主机之间要通信,就需要知道彼此的ip,端口号等信息,而一台主机这些信息的集合:

就可以理解为一个端点,即为套接字

双方通过套接字作为一种坐标,建立信息通道,形成连接(两点连接一条直线)

简单理解了套接字的概念后,来看看如何通过java socket编程来实现

两台主机文件的接收与发送:

代码如下:
发送方:
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;


/**
 * 发送者
 */
public class TcpSendCilent {
    public static void main(String[] args) throws Exception {
        //1.通过socket对象  创建socket连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
        //2,创建一个字节输出流
        OutputStream os = socket.getOutputStream();
        //3.字节文件输入流 读取文件
        //避免出错 写需要发送文件的绝对路径
        FileInputStream fis = new FileInputStream(new File("F:/TEST/1604407051256.jpg"));
        //4.字节文件输出流 写出文件
        byte[] buffer=new byte[1024*10];
        int len;
        while ((len=fis.read(buffer))!=-1){
            //socket编程基于I/O流 所以
            //输出流写转为字节数组的文件  =向接收方发送文件
           os.write(buffer,0,len);
        }
        //通知服务器我传送完了 调用shutdownOutput() 否则影响接下来代码执行
        socket.shutdownOutput();

        //确定服务器接受完毕,断开连接
        //获取接收方响应回来的 接受完毕! 响应
        InputStream inputStream = socket.getInputStream();
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        byte[] bytes2=new byte[1024*10];
        int len2;
        while ((len2=inputStream.read(bytes2))!=-1){
                baos.write(bytes2,0,len2);
        }
        //显示接收方的响应
        System.out.println(baos.toString());

        //发送结束后,最后关闭所有资源
        //关闭资源好习惯 这部分写的简单
        //一般建议先进行一个非空判断再关闭
        baos.close();
        fis.close();
     	os.close();
        socket.close();

    }
}

接收方:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 接收端
 */
public class TcpAcceptServer {
    public static void main(String[] args) throws IOException {
        //通过ServerSocket对象 创建接收端套接字
        ServerSocket serverSocket=null;
        //套接字
        Socket socket=null;
        //字节输入流
        InputStream in=null;

        //默认参数定义端口号  发送方依据这个端口号发送
        serverSocket=new ServerSocket(9000);
        socket = serverSocket.accept();
        //socket对象 获取输入流,拿到文件
        in = socket.getInputStream();

        //将发送者发送过来的 文件通过文件字节输出流 输出到指定路径下
        FileOutputStream fos = new FileOutputStream(new File("F:/recevice.jpg"));
        int len;
        byte[] bytes=new byte[1024*10];
        while ((len=in.read(bytes))!=-1){
                fos.write(bytes,0,len);
        }

        //通知发送者接受完毕了
        OutputStream outputStream = socket.getOutputStream();

        outputStream.write("我是文件接收者:我已成功接受".getBytes());
        //接受结束后,关闭资源好习惯 这部分写的简单
        //一般建议先进行一个非空判断再关闭
        fos.close();
        serverSocket.close();
        socket.close();
        in.close();
    }
}


测试方法:
以上代码可直接粘贴测试

1、先运行接收者等待接受,

2、再运行发送者,

3、等待接收者向发送者响应: 我是文件接收者:我已成功接受;

4、接收者指定接受目录下、查看接收文件存在即为接收成功!

总结:

这个demo实现并不是很难,主要考验了我们对于io流的熟练程度

  • 38
    点赞
  • 195
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值