客户端用C发送文件到Java服务器

本文介绍了如何使用C语言在Windows上利用TransmitFile函数将文件发送到Java服务器,特别强调了Netty在接收文件时默认字节长度问题的解决方法,即采用DelimiterBasedFrameDecoder,同时指出不应与StringDecoder一起使用,以免影响字节流的正确性。此外,还提及了因文件包含中文导致的乱码问题。
摘要由CSDN通过智能技术生成

前言

在写客户端发送文件到Java服务器的时候,一是遇到了Netty接收默认字节长度的问题,Netty默认的接收长度是1024,这个问题通过DelimiterBasedFrameDecoder解决。二是我一开始除了应用DelimiterBasedFrameDecoder之外,还应用了StringDecoder,结果在Handler里(继承自ChannelHandlerAdapter),接收到的object是String,然后通过String.getBytes()获得的字节流的长度总是和原文件的长度不同(通过notepad++查看)。随后,我把StringDecoder去掉了,只用DelimiterBasedFrameDecoder就可以了。

其中C端,我用的Windows上的零拷贝函数TransmitFile(),因为是通过字节流写文件的,所以如果通过记事本打开的文件包含中文的话会出现乱码问题。

源程序

客户端(C):

VS2019,Debug,Win32

#include <stdio.h>
#include <stdlib.h>

#include <ws2tcpip.h>
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")

#include <MSWSock.h>
#pragma comment(lib, "Mswsock.lib ")

int sendFile()
{
	const wchar_t* fileName = L"D:/writeJson.txt";
	const char* ip = "127.0.0.1";
	const char* port = "8080";
	

	// 创建并初始化winsock数据变量
	WSADATA wsaData = { 0 };
	int iResult = 0;

	SOCKET hSocket = INVALID_SOCKET;
	int iFamily = AF_INET;
	int iType = SOCK_STREAM;
	int iProtocol = IPPROTO_TCP;

	// 初始化 Winsock
	iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iResult != 0) {
		printf("WSASta
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值