目的: 我先从Client发送一个文件名到Server,再将文件内容传过去。从而在Server创建一个以从Client发送文件名的文件。
问题: 1. 文件名发送过去了,会在Server上建一个文件,但是内容是空的
2. 没有文件发送部分,文件成件被传送。
个人想法:
1. 被传送的文字格式与Java读取方式不一致。
还大哥们帮帮我啊。内部函数没有什么问题。
代码如下:
Server 端
// TcpServer.java by Greg 3/2004// usage : java tcpServer <port number>.
// default port is 1500.
// connection to be closed by client.
// this server handles only 1 connection.import java.net.*;
import java.io.*;public class TcpServer { public static void main(String args[]) { int port;
ServerSocket server_socket;
BufferedReader input;
DataOutputStream outputStream;
DataInputStream inputStream;
String message; try {
port = Integer.parseInt(args[0]);
}
catch (Exception e) {
System.out.println("port = 1500 (default)");
port = 1500;
} try {
server_socket = new ServerSocket(port);
System.out.println("Server waiting for client on port " +
server_socket.getLocalPort());
// server infinite loop
while (true) {
Socket socket = server_socket.accept();
System.out.println("New connection accepted " +
socket.getInetAddress() +
":" + socket.getPort());
// get file name
input = new BufferedReader(new InputStreamReade(socket.getInputStream()));
message = input.readLine();
//message = "test.txt"; 指向文件名
// print received data
try {
byte[] b = new byte[1024];
int bytes = 0;
File file = new File("C:/" + message);
if(file.exists())
file.delete();
outputStream = new DataOutputStream(new FileOutputStream(file));
inputStream = new DataInputStream(socket.getInputStream()); while ((bytes=inputStream.read(b))!= -1) {
outputStream.write(b, 0, bytes);
} outputStream.close();
inputStream.close();
}
catch (IOException e) {
System.out.println(e);
} // connection closed by client
try {
socket.close();
System.out.println("Connection closed by client");
}
catch (IOException e) {
System.out.println(e);
}
}
}
catch (IOException e) {
System.out.println(e);
}
}
} Client 端
// client.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "MySocket.h"
#include <iostream>
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{
CMySocket *mySocket = new CMySocket;
mySocket->Create();
mySocket->Connect("127.0.0.1", 1500); int i = 0; char buffer[1024];
DWORD dwBytesRead = 0;
DWORD NumberOfBytesRead;
HANDLE hFile;
while ( 2 ) {
hFile = ::CreateFile( "D:\\test.txt", // file to create
GENERIC_READ, // open for writing
0, // do not share
NULL, // default security
OPEN_EXISTING, // overwrite existing
FILE_ATTRIBUTE_NORMAL, // normal file
NULL ); // no attr. template
if ( hFile == INVALID_HANDLE_VALUE )
printf("Could not open file (error %d)\n", GetLastError());
mySocket->Send( "test.txt\r\n", sizeof(char) * strlen("test.txt") );
while (1) {
::ReadFile( hFile, buffer, sizeof(buffer), &NumberOfBytesRead, NULL );
if( NumberOfBytesRead == 0 )
break;
mySocket->Send(buffer, NumberOfBytesRead);
}
}
::CloseHandle(hFile);
//delete mySocket;
return 0;
}
问题: 1. 文件名发送过去了,会在Server上建一个文件,但是内容是空的
2. 没有文件发送部分,文件成件被传送。
个人想法:
1. 被传送的文字格式与Java读取方式不一致。
还大哥们帮帮我啊。内部函数没有什么问题。
代码如下:
Server 端
// TcpServer.java by Greg 3/2004// usage : java tcpServer <port number>.
// default port is 1500.
// connection to be closed by client.
// this server handles only 1 connection.import java.net.*;
import java.io.*;public class TcpServer { public static void main(String args[]) { int port;
ServerSocket server_socket;
BufferedReader input;
DataOutputStream outputStream;
DataInputStream inputStream;
String message; try {
port = Integer.parseInt(args[0]);
}
catch (Exception e) {
System.out.println("port = 1500 (default)");
port = 1500;
} try {
server_socket = new ServerSocket(port);
System.out.println("Server waiting for client on port " +
server_socket.getLocalPort());
// server infinite loop
while (true) {
Socket socket = server_socket.accept();
System.out.println("New connection accepted " +
socket.getInetAddress() +
":" + socket.getPort());
// get file name
input = new BufferedReader(new InputStreamReade(socket.getInputStream()));
message = input.readLine();
//message = "test.txt"; 指向文件名
// print received data
try {
byte[] b = new byte[1024];
int bytes = 0;
File file = new File("C:/" + message);
if(file.exists())
file.delete();
outputStream = new DataOutputStream(new FileOutputStream(file));
inputStream = new DataInputStream(socket.getInputStream()); while ((bytes=inputStream.read(b))!= -1) {
outputStream.write(b, 0, bytes);
} outputStream.close();
inputStream.close();
}
catch (IOException e) {
System.out.println(e);
} // connection closed by client
try {
socket.close();
System.out.println("Connection closed by client");
}
catch (IOException e) {
System.out.println(e);
}
}
}
catch (IOException e) {
System.out.println(e);
}
}
} Client 端
// client.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "MySocket.h"
#include <iostream>
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{
CMySocket *mySocket = new CMySocket;
mySocket->Create();
mySocket->Connect("127.0.0.1", 1500); int i = 0; char buffer[1024];
DWORD dwBytesRead = 0;
DWORD NumberOfBytesRead;
HANDLE hFile;
while ( 2 ) {
hFile = ::CreateFile( "D:\\test.txt", // file to create
GENERIC_READ, // open for writing
0, // do not share
NULL, // default security
OPEN_EXISTING, // overwrite existing
FILE_ATTRIBUTE_NORMAL, // normal file
NULL ); // no attr. template
if ( hFile == INVALID_HANDLE_VALUE )
printf("Could not open file (error %d)\n", GetLastError());
mySocket->Send( "test.txt\r\n", sizeof(char) * strlen("test.txt") );
while (1) {
::ReadFile( hFile, buffer, sizeof(buffer), &NumberOfBytesRead, NULL );
if( NumberOfBytesRead == 0 )
break;
mySocket->Send(buffer, NumberOfBytesRead);
}
}
::CloseHandle(hFile);
//delete mySocket;
return 0;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货