本文实例介绍了Java基于Socket的文件传输案例,分享给大家供大家参考,具体内容如下

1、Java代码

package com.wf.demo.socket.socketfile;

import java.net.*;

import java.io.*;

/**

* 2.socket的Util辅助类

*

* @author willson

*

*/

public class ClientSocket {

private String ip;

private int port;

private Socket socket = null;

DataOutputStream out = null;

DataInputStream getMessageStream = null;

public ClientSocket(String ip, int port) {

this.ip = ip;

this.port = port;

}

/**

* 创建socket连接

*

* @throws Exception

* exception

*/

public void CreateConnection() throws Exception {

try {

socket = new Socket(ip, port);

} catch (Exception e) {

e.printStackTrace();

if (socket != null)

socket.close();

throw e;

} finally {

}

}

// 发送消息

public void sendMessage(String sendMessage) throws Exception {

try {

out = new DataOutputStream(socket.getOutputStream());

if (sendMessage.equals("Windows")) {

out.writeByte(0x1);

out.flush();

return;

}

if (sendMessage.equals("Unix")) {

out.writeByte(0x2);

out.flush();

return;

}

if (sendMessage.equals("Linux")) {

out.writeByte(0x3);

out.flush();

} else {

out.writeUTF(sendMessage);

out.flush();

}

} catch (Exception e) {

e.printStackTrace();

if (out != null)

out.close();

throw e;

} finally {

}

}

// 接受消息

public DataInputStream getMessageStream() throws Exception {

try {

getMessageStream = new DataInputStream(new BufferedInputStream(

socket.getInputStream()));

return getMessageStream;

} catch (Exception e) {

e.printStackTrace();

if (getMessageStream != null)

getMessageStream.close();

throw e;

} finally {

}

}

// 关闭连接

public void shutDownConnection() {

try {

if (out != null)

out.close();

if (getMessageStream != null)

getMessageStream.close();

if (socket != null)

socket.close();

} catch (Exception e) {

}

}

}

2、Java代码

package com.wf.demo.socket.socketfile;

import java.io.BufferedInputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.net.ServerSocket;

import java.net.Socket;

/**

* 1.服务器端

*

* @author willson

*

*/

public class ServerTest {

int port = 8821;

void start() {

Socket socket = null;

try {

ServerSocket serverSocket = new ServerSocket(port);

while (true) {

// 选择进行传输的文件

String filePath = "E:\\lib.zip";

File fi = new File(filePath);

System.out.println("File Name:" + fi.getName() + ";\tFile Size():" + (int) fi.length() + "bytes");

// public Socket accept() throws

// IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。

System.out.println("等待客户端连接,连接端口:" + port);

socket = serverSocket.accept();

System.out.println("建立socket链接");

DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

dis.readByte();

DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));

DataOutputStream ps = new DataOutputStream(socket.getOutputStream());

// 将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java

// 4th里有现成的代码。

ps.writeUTF(fi.getName());

ps.flush();

ps.writeLong((long) fi.length());

ps.flush();

int bufferSize = 8192;

byte[] buf = new byte[bufferSize];

while (true) {

int read = 0;

if (fis != null) {

read = fis.read(buf);

}

if (read == -1) {

break;

}

ps.write(buf, 0, read);

}

ps.flush();

// 注意关闭socket链接哦,不然客户端会等待server的数据过来,

// 直到socket超时,导致数据不完整。

fis.close();

socket.close();

System.out.println("文件传输完成\n");

}

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String arg[]) {

new ServerTest().start();

}

}

3、客户端

package com.wf.demo.socket.socketfile;

import java.io.BufferedOutputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.FileOutputStream;

/**

* 3.客户端

*

* @author willson

*

*/

public class ClientTest {

private ClientSocket cs = null;

private String ip = "localhost";// 设置成服务器IP

private int port = 8821;

private String sendMessage = "Windwos";

public ClientTest() {

try {

if (createConnection()) {

sendMessage();

getMessage("F:\\");

}

} catch (Exception ex) {

ex.printStackTrace();

}

}

private boolean createConnection() {

cs = new ClientSocket(ip, port);

try {

cs.CreateConnection();

System.out.print("连接服务器成功!" + "\n");

return true;

} catch (Exception e) {

System.out.print("连接服务器失败!" + "\n");

return false;

}

}

private void sendMessage() {

if (cs == null)

return;

try {

cs.sendMessage(sendMessage);

} catch (Exception e) {

System.out.print("发送消息失败!" + "\n");

}

}

private void getMessage(String savePath) {

if (cs == null)

return;

DataInputStream inputStream = null;

try {

inputStream = cs.getMessageStream();

} catch (Exception e) {

System.out.print("接收消息缓存错误\n");

return;

}

try {

// 本地保存路径,文件名会自动从服务器端继承而来。

int bufferSize = 8192;

byte[] buf = new byte[bufferSize];

int passedlen = 0;

long len = 0;

savePath += inputStream.readUTF();

DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))));

len = inputStream.readLong();

System.out.println("File Size():" + len + "bytes");

System.out.println("开始接收文件!" + "\n");

while (true) {

int read = 0;

if (inputStream != null) {

read = inputStream.read(buf);

}

passedlen += read;

if (read == -1) {

break;

}

// 下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比

System.out.println("文件接收了" + (passedlen * 100 / len) + "%\n");

fileOut.write(buf, 0, read);

}

System.out.println("接收完成,文件存为" + savePath + "\n");

fileOut.close();

} catch (Exception e) {

System.out.println("接收消息错误" + "\n");

return;

}

}

public static void main(String arg[]) {

new ClientTest();

}

}

希望本文所述对大家学习java程序设计有所帮助。

java用socket解析16进制数据_浅析Java基于Socket的文件传输案例相关推荐

  1. python socket发送16进制数据_python socket以16进制的数据进行传递与解析

    参考:http://m.blog.csdn.net/blog/JasonQue/8256424 具体的struct模块的解释可以参照上面的链接. struct.pack也就是将数据按照二进制的格式进行 ...

  2. python socket发送16进制数据_Python UDP Socket 16进制数据发送

    注:此篇文章首次发表于我的一篇CSDN博客里边,现转载于此. 今天琢磨了一下Python UDP Socket 16进制数据发送. 原以为UDP发送和接受的都是字符,怎么能够发送16进制?但细想,其实 ...

  3. java socket发送16进制_JavaSocket短连接实现分别接收字符串和16进制数据

    做个笔记,在接收16进制数据的时候乱码了.原因是Socket在接收数据的时候需要根据不同的数据定义不同的接收方式,也就是约定好传输协议(具体体现在后面服务端接收16进制那里). 字符串的发送接收 字符 ...

  4. php接收16进制数据,PHP_PHP 通过Socket收发十六进制数据的实现代码,最近在php下做关于Socket通讯的 - phpStudy...

    $sendStr = '30 32 30 34 03 30 33';  // 16进制数据 $sendStrArray = str_split(str_replace(' ', '', $sendSt ...

  5. java串口发送16进制数据_MFC串口通信发送16进制数据的方法

    本文实例为大家分享了MFC串口通信发送16进制数据的具体代码,供大家参考,具体内容如下 MFC串口通信会使用m_mscomm控件. 发送数据一般是在edit control 里输入自己想发送的内容,然 ...

  6. Java的String/byte[]/16进制相互转换

    源代码下载地址: http://www.zuidaima.com/share/1550463378410496.htm Java 字符串转 16 进制工具类 Hex.java 实现 16进制 0xfe ...

  7. java int to hex_Java字符串转16 进制工具类Hex.java | 学步园

    Java 字符串转 16 进制工具类 Hex.java 实现 16进制 0xfecd .. 和 java 字符串之间的互转换! 如果做开发,通常用户登陆密码都会 mad5(salt + pwd) 然后 ...

  8. python3.6串口编程实例_Python3 串口接收与发送16进制数据包的实例

    Python3 串口接收与发送16进制数据包的实例 如下所示: import serial import string import binascii s=serial.Serial('com4',9 ...

  9. [工具]-C语言中字符串的形式打印16进制数据

    C语言中字符串的形式打印16进制数据. 这样写,输出更直观些 #define PRINT_BUF_MAX (32) #define TAG_STRING_MAX (32) static void pr ...

  10. python 输出\xhh格式的16进制数据(改2)

    温馨提示:标题解决方案请浏览后面部分,傻吊网友请按顺序浏览 启蒙(转载)自:https://blog.csdn.net/dengzhaoqun/article/details/8923259 顺带st ...

最新文章

  1. Spring Boot + GraphQL 才是 API 的未来!
  2. 【星球知识卡片】残差网络家族10多个变种学习卡片,请收下!
  3. java 参数 string_关于Java中String类型的参数传递问题
  4. 如何用jsp连接mysql_如何用jsp连接mysql数据库
  5. eeprom的wp 引脚_EEPROM存储芯片24C02
  6. Ubuntu文件上锁了,怎么打开???亲测有效
  7. java数据分析库,威力加强版
  8. 2018.9.19.Matlab实验四:Matlab程序设计
  9. pythonjam可以画图吗_GitHub - jamfs/pyecharts: Python Echarts Plotting Library
  10. branch and bound(分支定界)算法-基础概念
  11. java左手握右手_在队列中,向中看齐举哪个手?
  12. Java–cvc-complex-type.4:Attribut ‘version’ must appear on element ‘web-app’
  13. UG NX10 NX12 用曲线方程式绘制实体模型的方法
  14. 日期插件-jeDate
  15. Opencv实现身份证OCR识别
  16. 备份计算机软件,如何备份电脑里面的软件
  17. LCM ASN 在MOBILE下收货流程的后台数据流
  18. 会议怎样召开_是否可以仅使用免费软件来召开会议?
  19. Java中String 字符串与List<String>互转
  20. 图片转文字微信小程序使用方法

热门文章

  1. hashcat的使用及相关
  2. Debian(Linux) 安装Windows通用字体(可解决TimesNewRoman等字体的报错)
  3. Python GUI - 利用Tkinter制作个性签名设计软件!
  4. 2022年了,如何制定今年的战略目标?人人必知
  5. 用java制作扑克牌_java实现简单扑克牌游戏
  6. Up in the Air-16
  7. 企业邮箱如何设置邮件监控
  8. 用C语言解一元二次方程
  9. 辣妈直升机视频号值得学习吗
  10. kangle虚拟主机系统easypanel使用教程