Java客户端上传图片(文件)到c++服务器
主要思路:将所有的数据类型都转化为byte流,对byte进行传输,c++服务器使用char数组,java使用byte数组进行图片(文件)的传输。
传输过程(socket建立连接的条件下):
C++服务器
TAG.h
#pragma once
#define _TAG_H_
#ifdef _TAG_H_
#include
#define BUF_LEN 2048
#define SendFile 0x01
#define StopSendFile 0x02
#define SendString 0x03
#define FileInfo 0x04
typedef struct
{
int ID;
BYTE lparam[BUF_LEN];
}COMMAND;
typedef struct {
long fileLenght;
char fileName[MAX_PATH];
}FILEINFO;
#endif // _TAG_H_
SocketHead.h
#pragma once
#include
using namespace std;
#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib
class CInitSock
{
public:
CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
{
// 初始化WS2_32.dll
WSADATA wsaData;
WORD sockVersion = MAKEWORD(minorVer, majorVer);
if (::WSAStartup(sockVersion, &wsaData) != 0)
{
exit(0);
}
}
~CInitSock()
{
::WSACleanup();
}
};
CPlusServer.cpp
// CPlusServer.cpp : 定义控制台应用程序的入口点。
//
/*
author:chenjianrun
time: 2016-9-15
city: zhuhai
*/
#include "stdafx.h"
#include"SocketHead.h"
#include "iostream"
#include "string.h"
#include "fstream"
#include
#include"TAG.h"
using namespace std;
//初始化结构体SOCKADDR_IN
sockaddr_in initSockaddr_in();
//监听线程
DWORD WINAPI SListen(LPVOID lparam);
//接收文件
void recvFile(SOCKET socket);
//初始化socket
void InitSocket();
CInitSock initsocket;
int main()
{
InitSocket();
return 0;
}
void InitSocket() {
SOCKET serverSocket;
SOCKET listenSocket;
sockaddr_in serveraddr = initSockaddr_in();
sockaddr_in clientaddr;
//创建socket
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//进行绑定
bind(serverSocket, (sockaddr*)&serveraddr, sizeof(serveraddr));
//进行监听
listen(serverSocket, 5);
cout << "server start" << endl;
int len = sizeof(clientaddr);
while (true) {
if (listenSocket = accept(serverSocket, (sockaddr*)&clientaddr, &len));
{
//启动会话线程
CreateThread(NULL, NULL, SListen, (LPVOID)listenSocket, NULL, NULL);
cout << "CreateThread is start"<
Java客户端
Client.java
/*
author:chenjianrun
time: 2016-9-15
city: zhuhai
*/
package client;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
private static NetDataTypeTransform transform1;
private static DataInputStream fromServerStream;
private static DataOutputStream toServerStream;
private static NetDataCommand dataCommand;
private static DataFileInfo dataFileInfo;
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost",8888);
toServerStream = new DataOutputStream(socket.getOutputStream());
//发送要发送文件的指令
int id = 1;
String tempStr = "4.jpg";
dataCommand = new NetDataCommand(id,tempStr);
toServerStream.write(dataCommand.getByteArrayData());
toServerStream.flush();
//启动发送文件线程
SendFileThread sendFileThread = new SendFileThread(socket);
sendFileThread.start();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
NetDataTypeTransform.java
package client;
import java.io.UnsupportedEncodingException;
public class NetDataTypeTransform {
public static final String coding="GB2312"; //全局定义,以适应