自己用java实现飞鸽传书 2 - 实现文件传输

第二步:实现文件传递。

上一步只是从服务端传递了一个字符串到客户端,这次需要对代码进行调整,实现从服务端获取文件,在客户端将文件存入目标地址。

调整后的代码:

服务端:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args){
        //创建服务端socket,用以网络信息的接收
        ServerSocket serverSocket = null;
        try {
            //服务端socket使用本地IP,端口号使用36000
            serverSocket = new ServerSocket(36000);
            //保证服务端持续运行
            while(true){
                //接收网络信息,未接收到则阻塞当前线程
                Socket socket = serverSocket.accept();
                //将文件信息写入socket通信
                writeFile(socket);
                //关闭socket,防止客户端长时间等待
                socket.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 将文件信息写入socket通信流
     * @param socket
     *             socket
     */
    private static void writeFile(Socket socket){
        try{
            //获取本地文件
            String filePath ="D:/test.pdf";
            //创建文件对象
            File file = new File(filePath);
            //使用DataOutputStream传送文件信息
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            //写入文件名
            dos.writeUTF(file.getName());
            //写入文件大小
            dos.writeLong(file.length());
            //清空缓冲区
            dos.flush();
            //使用DataInputStream将文件写入
            DataInputStream dis = new DataInputStream( new FileInputStream(file) );
            byte[] buffer = new byte[1024];
            int head = 0;
            while((head=dis.read(buffer)) > 0){
                dos.write(buffer, 0, head);
            }
            dis.close();
            dos.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

客户端:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.net.Socket;

public class Client {

    public static void main(String[] args){
        DataInputStream input = null;
        Socket clientSocket = null;
        try {
            //创建客户端socket,用以连接服务端
            clientSocket = new Socket("127.0.0.1", 36000);
            //读取服务端发送的信息流
            input = new DataInputStream(clientSocket.getInputStream());
            String fileName = input.readUTF();
            long fileSize = input.readLong();
            System.out.println("收到服务端发过来的文件,文件名称为:"
                                + fileName + ",文件大小为:" + fileSize);
            //将文件读入本地
            String savePath = "E:\\just a test.pdf";
            DataOutputStream fos = new DataOutputStream(new FileOutputStream(savePath));
            byte[] buffer = new byte[1024];
            int head = 0;
            while((head=input.read(buffer)) > 0){
                fos.write(buffer, 0, head);
            }

            fos.close();
            input.close();
            clientSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

本次文件流的传送使用了DataOutputStream和DataInputStream,使用Data类型的字节流可以根据信息类型分别进行处理。

时间: 2024-08-03 03:11:42

自己用java实现飞鸽传书 2 - 实现文件传输的相关文章

自己用java实现飞鸽传书 1 - 实现通信

第一步: 建立服务端客户端,实现端到端通信.因为要传递文件,信号量较大,故使用TCP/IP协议. 服务端和客户端都要建立socket,而后通过socket进行通信. 服务端代码如下: import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args){ //创建服务端socket,

飞鸽传书官方站点 创立黑马程序猿训练营

张孝祥于2001年创办锐信科技有限公司,2005年创办传智播客科技有限公司,飞鸽传书官方站点 创立黑马程序猿训练营,一直致力于陶瓷的飞鸽传书软件开发教育事业,张孝祥老师善于解剖和分析问题,善于使用生动形象的比喻,能将复杂的.难于理解的问题与知识简单化解说,其人生格言是为千万人少走弯路而著书.为中华软件之崛起而讲课,从锐信科技到传智播客,十几年来,张孝祥一直在践行着这一格言,亲身培养了上万名优秀的软件开发者. 这个理由也许为很多人不耻,但确实是依据自己的飞鸽传书情况来选的.要知道这么多年没踫过数学

飞鸽传书 bind() error=10048错误的解决方法

提示  bind() 错误=10048 原因:其他程序占用飞鸽的 2425 端口 比如:飞秋也是使用2425端口 解决:用netstat命令查看是哪个进程占用了该端口 格式:netstat -ano | find "2425" 结果:  UDP    0.0.0.0:2425     *:*        1716 最后的1716就是占用2425进程的进程ID,看看是什么,可以结束的直接结束该进程,再打开飞鸽就可以了. 关于netstat命令可以输入命令 netstat /? 查看更多

飞鸽传书linux进程退出不彻底

问题描述: 飞鸽传书linux版本(QIpmsg)是有问题的. 在ubuntu14.04上运行的时候,没有任务栏图标,点击关闭也不能退出进程,端口仍然占用,无法再次运行. 这个问题截至1.2.141211版本中依然存在,不知道什么时候能解决. 解决之道: 我用飞鸽主要是传文件,但是我没耐心坐等,所以要自己动动手. 写个脚本,从控制台启动,用完以后直接 ^C结束,干干净净. #!/bin/bash cd ~/app/ipmsg ./QIpmsg.1.2.141211 这样用着就好一点了.

linux终端下飞鸽传书(飞秋)协议的简单实现

记得这还是当时在凌阳上网络课程时的做得一个小项目,过了这么久怕忘得一干二净,今天拿出来晒晒记忆,温故而知新. 这里我就不说飞鸽的具体协议了,而是重点列出主要我设计的程序框架. 工程文件组织架构: Makefile :工程编译管理文件 main.c :工程主main入口c文件 myinclude.h :公共头文件集合 ipmsg.h :IPMSG协议头文件 communication.c :用于实现消息及文件收发的c文件 communication.h file_manager.c :用链表实现的

飞鸽传书源码分析二消息机制

转载请注明出处:http://blog.csdn.net/mxway/article/details/40225725 本篇文章是在飞鸽传书2.06源码的基础的分析的. 飞鸽传书的消息大致可分为三类:普通窗口类(后面以TMainWin为例进行分析)消息,对话框类(后面以TSendDlg为例进行分析)消息,对话框控件(后面以TEditSub为例进行分析)消息.这三类消息先合后分,这三类窗口设置的消息处理函数都是TApp::WinProc,在TApp::WinProc函数中再分发给各自的消息处理函数

飞鸽传书源码分析五-文件传输

转载请注明出处:http://blog.csdn.net/mxway/article/details/44889871 本文是在飞鸽传书源码v2.06的基础上进行分析的. 1.添加要发送的文件 文件的发送是在发送对话框中进行的,首先找到发送对话框的快捷菜单. File Transfer对应的菜单id为MENU_FILEADD,相应的command处理事件在Senddlg.cpp中的EvCommand函数中 BOOL TSendDlg::EvCommand(WORD wNotifyCode, WO

飞鸽传书源码分析-程序启动过程

转载请注明出处:http://blog.csdn.net/mxway/article/details/39581119 本文章是在飞鸽传书的2.06源码基础上分析 飞鸽传书源码运行流程如下,本篇文章只说明了飞鸽传书的启动过程,对于飞鸽伟书的消息机制及菜单加载等功能都不在本篇文章范围之内. 1. WinMain函数 int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdLine, int nCmdShow) { TMsgApp app(hI, c

飞鸽传书源码分析三-网络

转载请注明出处:http://blog.csdn.net/mxway/article/details/44195099 本文是在飞鸽传书2.06源码基础之上进行分析的. 一.网络的初始化 飞鸽传书主窗口对应的类TMainWin的构造函数中有如下的代码 cfg = new Cfg(nicAddr, portNo = _portNo); if ((msgMng = new MsgMng(nicAddr, portNo, cfg))->GetStatus() == FALSE) { ::ExitPro