C# .txt文件通过网络传输(客户端/服务器)-.txt文件在服务器上包含错误的内容
我正在开发一个客户机-服务器程序。客户端向服务器发送一个.txt文件,服务器接收并保存该.txt文件 我的问题是: 如果我发送一个包含以下内容的.txt文件:“Hello world”(不带“”) 然后服务器接收/保存一个.txt文件,该文件包含以下内容“无” 两个文件的文件大小完全相同 这是我的代码: 客户: Program.csC# .txt文件通过网络传输(客户端/服务器)-.txt文件在服务器上包含错误的内容,c#,client-server,file-transfer,C#,Client Server,File Transfer,我正在开发一个客户机-服务器程序。客户端向服务器发送一个.txt文件,服务器接收并保存该.txt文件 我的问题是: 如果我发送一个包含以下内容的.txt文件:“Hello world”(不带“”) 然后服务器接收/保存一个.txt文件,该文件包含以下内容“无” 两个文件的文件大小完全相同 这是我的代码: 客户: Program.cs using System; using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FTP_3___Client {
public class Program {
static void Main(string[] args) {
new Client();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FTP_3___Server {
class Program {
static void Main(string[] args) {
new Server();
}
}
}
客户:
Client.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using FTP_3___Client;
namespace FTP_3___Client {
public class Client {
public string name { get; set; }
public TcpClient clientConnection { get; set; }
public NetworkStream nws { get; set; }
public StreamReader sr { get; set; }
public StreamWriter sw { get; set; }
public int sizeOfConnectedClients { get; set; }
public string clientnamelistString { get; set; }
public Client() {
connectToServer();
sendFile("zzz.txt");
}
public void connectToServer() {
Console.WriteLine("connect to server...");
clientConnection = new TcpClient();
IPAddress ipadress = IPAddress.Parse("127.0.0.1");
clientConnection.Connect(ipadress, 5555);
Console.WriteLine("connected to server!");
nws = clientConnection.GetStream();
sr = new StreamReader(nws);
sw = new StreamWriter(nws);
}
private void sendFile(string filename) {
FileStream fs = File.OpenRead(filename);
FileInfo fo = new FileInfo(filename);
long filesize = fo.Length;
Console.WriteLine("Filesize: " + filesize);
sw.WriteLine("/sendFile");
sw.Flush();
// Send filename to server
sw.WriteLine("Filename: " + filename);
sw.Flush();
// Send filesize to server
sw.WriteLine("Filesize: " + filesize);
sw.Flush();
byte[] fileBytes = File.ReadAllBytes(filename);
sw.WriteLine(fileBytes.Length);
sw.Flush();
for (int i = 0; i < fileBytes.Length; i++) {
nws.WriteByte(fileBytes[i]);
}
sr.Close();
sw.Close();
nws.Close();
Console.WriteLine("File sends!");
Console.ReadLine();
}
}
}
服务器:Server.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace FTP_3___Server {
public class Server {
private IPAddress ipadress;
private TcpListener serverconnection;
private TcpClient clientconnection;
public NetworkStream nws { get; set; }
public StreamReader sr { get; set; }
public StreamWriter sw { get; set; }
public Server() {
startServer();
waitForClient();
}
public void startServer() {
ipadress = IPAddress.Parse("127.0.0.1");
serverconnection = new TcpListener(ipadress, 5555);
serverconnection.Start();
}
public void waitForClient() {
Console.WriteLine("Server startet. Waiting for incoming client connections...");
clientconnection = serverconnection.AcceptTcpClient();
nws = clientconnection.GetStream();
sr = new StreamReader(nws);
sw = new StreamWriter(nws);
Console.WriteLine("Client connected with Server!");
receiveMessage();
}
public void receiveMessage() {
string receivedMessage = sr.ReadLine();
switch (receivedMessage) {
case "/sendFile": {
receiveFile();
break;
}
default: {
Console.WriteLine("Received undefined message: " + receivedMessage);
break;
}
}
}
public void receiveFile() {
// Recieve filename
string filename = sr.ReadLine().Remove(0, 10);
// Recieve filesize
long filesize = Convert.ToInt64(sr.ReadLine().Remove(0, 10));
Console.WriteLine("Filename: " + filename);
Console.WriteLine("Filesize: " + filesize);
long count = filesize;
int arrayLength = Convert.ToInt32(sr.ReadLine());
byte[] filebytes = new byte[arrayLength];
for (int i = 0; i < filebytes.Length; i++) {
filebytes[i] = (byte)nws.ReadByte();
}
try {
File.WriteAllBytes(filename, filebytes);
} catch (IOException e) {
Console.WriteLine(e.StackTrace);
}
sr.Close();
sw.Close();
nws.Close();
Console.WriteLine("File was written on HDD. Finish!");
Console.ReadLine();
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用系统线程;
Net系统;
使用System.Net.Sockets;
使用System.IO;
命名空间FTP_3___服务器{
公共类服务器{
私人IP地址;
专用TcpListener服务器连接;
专用TCP客户端连接;
公共网络流nws{get;set;}
公共StreamReader sr{get;set;}
公共StreamWriter sw{get;set;}
公共服务器(){
startServer();
waitForClient();
}
public void startServer(){
IPAddress=IPAddress.Parse(“127.0.0.1”);
服务器连接=新的TcpListener(iPAddress,5555);
serverconnection.Start();
}
public void waitForClient(){
Console.WriteLine(“服务器启动。等待传入的客户端连接…”);
clientconnection=serverconnection.AcceptTcpClient();
nws=clientconnection.GetStream();
sr=新的StreamReader(nws);
sw=新StreamWriter(nws);
WriteLine(“客户端连接到服务器!”);
receiveMessage();
}
public void receiveMessage(){
字符串receivedMessage=sr.ReadLine();
开关(接收消息){
案例“/sendFile”:{
receiveFile();
打破
}
默认值:{
Console.WriteLine(“接收到未定义的消息:+receivedMessage”);
打破
}
}
}
公共无效接收文件(){
//接收文件名
字符串文件名=sr.ReadLine().Remove(0,10);
//接收文件大小
long filesize=Convert.ToInt64(sr.ReadLine().Remove(0,10));
Console.WriteLine(“文件名:”+Filename);
WriteLine(“Filesize:+Filesize”);
长计数=文件大小;
int arrayLength=Convert.ToInt32(sr.ReadLine());
byte[]filebytes=新字节[arrayLength];
for(int i=0;i
C.Evenhuis在评论中给出了答案。不要盲目地将nws.ReadByte()
的返回值强制转换为byte
,检查它是否返回-1,因为这表示流的结束。我更改了它,现在服务器收到的.txt文件只包含11个空格……这意味着服务器端从未收到文件内容,或者您已经读过它。也许StreamReader
已经读取了这些字节并缓冲了它们?我认为您不应该从StreamReader
直接从底层流中读取。非常感谢,这是我的问题!我刚才不是用Networkstream而是用Streamreader/Streamwriter读/写文件字节。