前言
在写客户端发送文件到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