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();
    }}

已有 0 条评论

    欢迎您,新朋友,感谢参与互动!