java用socket解析16进制数据_浅析Java基于Socket的文件传输案例
本文实例介绍了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的文件传输案例相关推荐
- python socket发送16进制数据_python socket以16进制的数据进行传递与解析
参考:http://m.blog.csdn.net/blog/JasonQue/8256424 具体的struct模块的解释可以参照上面的链接. struct.pack也就是将数据按照二进制的格式进行 ...
- python socket发送16进制数据_Python UDP Socket 16进制数据发送
注:此篇文章首次发表于我的一篇CSDN博客里边,现转载于此. 今天琢磨了一下Python UDP Socket 16进制数据发送. 原以为UDP发送和接受的都是字符,怎么能够发送16进制?但细想,其实 ...
- java socket发送16进制_JavaSocket短连接实现分别接收字符串和16进制数据
做个笔记,在接收16进制数据的时候乱码了.原因是Socket在接收数据的时候需要根据不同的数据定义不同的接收方式,也就是约定好传输协议(具体体现在后面服务端接收16进制那里). 字符串的发送接收 字符 ...
- php接收16进制数据,PHP_PHP 通过Socket收发十六进制数据的实现代码,最近在php下做关于Socket通讯的 - phpStudy...
$sendStr = '30 32 30 34 03 30 33'; // 16进制数据 $sendStrArray = str_split(str_replace(' ', '', $sendSt ...
- java串口发送16进制数据_MFC串口通信发送16进制数据的方法
本文实例为大家分享了MFC串口通信发送16进制数据的具体代码,供大家参考,具体内容如下 MFC串口通信会使用m_mscomm控件. 发送数据一般是在edit control 里输入自己想发送的内容,然 ...
- Java的String/byte[]/16进制相互转换
源代码下载地址: http://www.zuidaima.com/share/1550463378410496.htm Java 字符串转 16 进制工具类 Hex.java 实现 16进制 0xfe ...
- java int to hex_Java字符串转16 进制工具类Hex.java | 学步园
Java 字符串转 16 进制工具类 Hex.java 实现 16进制 0xfecd .. 和 java 字符串之间的互转换! 如果做开发,通常用户登陆密码都会 mad5(salt + pwd) 然后 ...
- python3.6串口编程实例_Python3 串口接收与发送16进制数据包的实例
Python3 串口接收与发送16进制数据包的实例 如下所示: import serial import string import binascii s=serial.Serial('com4',9 ...
- [工具]-C语言中字符串的形式打印16进制数据
C语言中字符串的形式打印16进制数据. 这样写,输出更直观些 #define PRINT_BUF_MAX (32) #define TAG_STRING_MAX (32) static void pr ...
- python 输出\xhh格式的16进制数据(改2)
温馨提示:标题解决方案请浏览后面部分,傻吊网友请按顺序浏览 启蒙(转载)自:https://blog.csdn.net/dengzhaoqun/article/details/8923259 顺带st ...
最新文章
- Spring Boot + GraphQL 才是 API 的未来!
- 【星球知识卡片】残差网络家族10多个变种学习卡片,请收下!
- java 参数 string_关于Java中String类型的参数传递问题
- 如何用jsp连接mysql_如何用jsp连接mysql数据库
- eeprom的wp 引脚_EEPROM存储芯片24C02
- Ubuntu文件上锁了,怎么打开???亲测有效
- java数据分析库,威力加强版
- 2018.9.19.Matlab实验四:Matlab程序设计
- pythonjam可以画图吗_GitHub - jamfs/pyecharts: Python Echarts Plotting Library
- branch and bound(分支定界)算法-基础概念
- java左手握右手_在队列中,向中看齐举哪个手?
- Java–cvc-complex-type.4:Attribut ‘version’ must appear on element ‘web-app’
- UG NX10 NX12 用曲线方程式绘制实体模型的方法
- 日期插件-jeDate
- Opencv实现身份证OCR识别
- 备份计算机软件,如何备份电脑里面的软件
- LCM ASN 在MOBILE下收货流程的后台数据流
- 会议怎样召开_是否可以仅使用免费软件来召开会议?
- Java中String 字符串与List<String>互转
- 图片转文字微信小程序使用方法