通过TCP发送和接收多个文件 [英] Send and receive multiple files over TCP

查看:135
本文介绍了通过TCP发送和接收多个文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述





我有一个tcp发件人通过tcp发送文件。

我有接收文件并将其保存到磁盘的接收器。

它适用于一个文件,用于多个文件它不起作用

我正在googleing几天,几乎所有的文章都没有找到解决方案。

如果有人可以帮助我并让我的代码运行,我会非常感激!!!

感谢高级!





在发件人中,我有一个fileSystemWatcher,可以观看文件夹,当文件创建它需要文件并由发送者通过tcp发送。



这是发件人代码:



 使用系统; 
使用 System.Collections.Generic;
使用 System.IO;
使用 System.Linq;
使用 System.Net;
使用 System.Net.Sockets;
使用 System.Text;
使用 System.Threading;
使用 System.Threading.Tasks;

命名空间发​​件人
{
/// < 摘要 >
/// SocketSender用于异步监听客户端并将文件发送到客户端。
/// < / summary >
public class SocketSender
{

# region memebers

private IPEndPoint targetEndPoint = null ;
private bool _isConnected;
Socket clientSock = null ;
private ManualResetEvent PauseIfDisconnected;

#endregion


public SocketSender(IPEndPoint ipEndPoint)
{
targetEndPoint = ipEndPoint;
clientSock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
_isConnected = false ;
PauseIfDisconnected = new ManualResetEvent(_isConnected);
}


public void Connect()
{
尝试
{
while (< span class =code-keyword> true )
{
if (!_isConnected)
{
尝试
{
// 连接
clientSock = null ;
clientSock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

clientSock.Connect(targetEndPoint); // 目标机器的IP地址和端口号

PauseIfDisconnected.Set( );
_isConnected = true ;
}
catch (例外情况)
{
Console.WriteLine( ======= ERROR连接功能=====);
Console.WriteLine(ex.ToString());
}
}
else
{
if (!clientSock.Connected)
{
PauseIfDisconnected.Reset();
_isConnected = false ;
clientSock.Close();
}
}
}
}
catch (例外情况)
{
Console.WriteLine( ======= ERROR Connect function =====);
Console.WriteLine(ex.ToString());
}
}



/// < 摘要 >
/// 将文件信息发送给客户
/// < / summary >
public void 发​​送( string fileToSend)
{
if (targetEndPoint == null
return ;

Socket clientSock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);


// 将xml转换为字节数组
byte [] fileName = Encoding.UTF8.GetBytes(Path.GetFileName(fileToSend)); // 文件名

// 此行 - 读取字节在第一次之后导致 - 例外:另一个进程正在使用该文件。但如果我调试它 - 它的工作原理并没有失败(为什么?)
byte [] fileData = File.ReadAllBytes(fileToSend) ; // file


byte [] fileNameLen = BitConverter.GetBytes(fileName.Length); // 文件名长度
var clientData = new byte [ 4 + fileName.Length + fileData.Length];

fileNameLen.CopyTo(clientData, 0 );
fileName.CopyTo(clientData, 4 );
fileData.CopyTo(clientData, 4 + fileName.Length);


尝试
{
clientSock.Connect(targetEndPoint);
clientSock.Send(clientData);
clientSock.Close();
}
catch (例外情况)
{
Console.WriteLine( ======= ERROR发送功能=====);
Console.WriteLine(ex.ToString());


}

}
}
}





她是接收代码(另一个项目):



 使用系统; 
使用 System.Collections.Generic;
使用 System.IO;
使用 System.Linq;
使用 System.Net;
使用 System.Net.Sockets;
使用 System.Text;
使用 System.Threading;
使用 System.Threading.Tasks;

命名空间接收者
{

/// < 摘要 >
/// AsynchronousClient用于从服务器异步接收文件。
/// < / summary >
public class AsynchronousClient
{

#区域成员

线程t1;
int flag = 0 ;
IPEndPoint ipEnd = null ;
string folderSavePath;
public static ManualResetEvent allDone = new ManualResetEvent( false );

#endregion

public AsynchronousClient(IPEndPoint ipEndPoint, string fSavePath)
{
ipEnd = ipEndPoint;
folderSavePath = fSavePath;

t1 = new 线程( new ThreadStart(StartListening));
t1.Start();
}


/// < 摘要 >
< span class =code-summarycomment> /// 开始连接到服务器。
/// < / summary >
public void StartListening()
{
if (ipEnd == null
return ;


Socket listener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
尝试
{
listener.Bind(ipEnd);
listener.Listen( 100 );
while true
{
allDone.Reset() ;
listener.BeginAccept( new AsyncCallback(AcceptCallback),listener);
allDone.WaitOne();

}
}
catch (例外情况)
{

}

}

public void AcceptCallback( IAsyncResult ar)
{

allDone.Set();


套接字侦听器=(套接字)ar.AsyncState;
Socket handler = listener.EndAccept(ar);


StateObject state = new StateObject();
state.WorkSocket = handler;

// 开始从服务器接收文件。
handler.BeginReceive(state.Buffer, 0 ,StateObject.BufferSize, 0 new AsyncCallback(ReadCallback),state);
flag = 0 ;
}

string fileSavePath = string .Empty;

/// < 摘要 >
/// 接收服务器发送的文件。
/// < / summary >
public void ReadCallback(IAsyncResult ar)
{

int fileNameLen = 1 ;
String content = String .Empty;
StateObject state =(StateObject)ar.AsyncState;
套接字处理程序= state.WorkSocket;
int bytesRead = handler.EndReceive(ar);


尝试
{
if (bytesRead > 0
{

if (flag == 0
{

// 创建需要保存的文件夹

if (!Directory.Exists(folderSavePath))
{
Directory.CreateDirectory(folderSavePath);
}

// 从服务器获取文件名长度。
fileNameLen = BitConverter.ToInt32(state.Buffer, 0 );
string fileName = Encoding.UTF8.GetString(state.Buffer, 4 ,fileNameLen);

fileSavePath = folderSavePath + \\ + fileName;
flag ++;
}
如果(flag > = 1
{
使用(BinaryWriter writer = new BinaryWriter(File.Open(fileSavePath,FileMode.Append,FileAccess.Write,FileShare.ReadWrite)))
{
if (flag == 1
{
writer.Write(state.Buffer, 4 + fileNameLen,bytesRead - ( 4 + fileNameLen));
flag ++;
}
else
writer.Write(state.Buffer, 0 ,bytesRead);

writer.Flush();
writer.Close();
}

handler.BeginReceive(state.Buffer, 0 ,StateObject.BufferSize, 0
new AsyncCallback(ReadCallback),state);

}

}
else
{
handler.Close( );
}
}
catch (例外情况)
{

}

}


}

}





我尝试了什么:



我试图开发一个通过TCP发送多个大文件的tcp发送者,

和一个接收器,它监听并从TCP获取文件并将它们保存到磁盘。

解决方案

只需看看你的代码:

另一个进程正在使用 文件



它表示正在读取您的文件,并且您想要同时再次读取它。



读取一次,将其拆分为多个块,然后发送此块。 / BLOCKQUOTE>

Hi,

I have a tcp sender that send large file over tcp.
I have a receiver that receive the files and save them to disk.
It work great for one file, for multiple files it does not work!
I am googleing a few days, went over almost all articles and did not find a solution.
I would VERY appreciate if someone can help me and make my code run as I need!!!
thanks in advanced!


In the sender , I have a fileSystemWatcher, that watch a folder, and when a file created it takes the file and send it over tcp, by the sender.

Here is the sender code:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Sender
{
    /// <summary>
    /// SocketSender is used to asynchronously listen the client and send file to the client.
    /// </summary>
    public   class SocketSender
    { 
        
        #region Memebers
    
        private  IPEndPoint targetEndPoint = null;
        private bool _isConnected;
        Socket clientSock = null;
        private ManualResetEvent PauseIfDisconnected;

        #endregion


        public SocketSender(IPEndPoint ipEndPoint)
        {
            targetEndPoint= ipEndPoint;
            clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _isConnected = false;
            PauseIfDisconnected = new ManualResetEvent(_isConnected);
        }


        public void Connect()
        {
            try
            {
                while (true)
                {
                    if (!_isConnected)
                    {
                        try
                        {
                            // Connect
                            clientSock = null;
                           clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                            clientSock.Connect(targetEndPoint); //target machine's ip address and the port number

                            PauseIfDisconnected.Set();
                            _isConnected = true;
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("======= ERROR Connect function =====");
                            Console.WriteLine(ex.ToString());
                        }
                    }
                    else
                    {
                        if (!clientSock.Connected)
                        {
                            PauseIfDisconnected.Reset();
                            _isConnected = false;
                            clientSock.Close();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("======= ERROR Connect function =====");
                Console.WriteLine(ex.ToString());
            }
        }
       
 

        /// <summary>
        /// Send file information to client
        /// </summary>
        public void Send(string fileToSend)
        {
            if (targetEndPoint == null)
                return;

            Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


            // Turn xml to bytes array
            byte[] fileName = Encoding.UTF8.GetBytes(Path.GetFileName(fileToSend)); //file name

           //This line - read bytes cause after the first time- an exception of :the file is being used by another process. but if I debug it- it works and doesn't fail (why?)
            byte[] fileData = File.ReadAllBytes(fileToSend); //file


            byte[] fileNameLen = BitConverter.GetBytes(fileName.Length); //lenght of file name
          var  clientData = new byte[4 + fileName.Length + fileData.Length];

            fileNameLen.CopyTo(clientData, 0);
            fileName.CopyTo(clientData, 4);
            fileData.CopyTo(clientData, 4 + fileName.Length);


            try
            {
                clientSock.Connect(targetEndPoint);
                clientSock.Send(clientData);
                clientSock.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("======= ERROR Send function =====");
                Console.WriteLine(ex.ToString());

           
            }
           
        }
    }
}



Her is the receive code (a different project):

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Receiver
{

    /// <summary>
    /// AsynchronousClient is used to asynchronously receive the file from server.
    /// </summary>
    public   class AsynchronousClient
    {

        #region Members

          Thread t1;
          int flag = 0;
         IPEndPoint ipEnd = null;
         string folderSavePath;
         public static ManualResetEvent allDone = new ManualResetEvent(false);

        #endregion

         public AsynchronousClient(IPEndPoint ipEndPoint, string fSavePath)
         {
             ipEnd = ipEndPoint;
             folderSavePath = fSavePath;

             t1 = new Thread(new ThreadStart(StartListening));
             t1.Start();
         }


        /// <summary>
        /// Start connect to the server.
        /// </summary>
        public   void StartListening()
        {
            if (ipEnd == null)
                return;

  
            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                listener.Bind(ipEnd);
                listener.Listen(100);
                while (true)
                {
                    allDone.Reset();
                    listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
                    allDone.WaitOne();

                }
            }
            catch (Exception ex)
            {

            }

        }

        public   void AcceptCallback(IAsyncResult ar)
        {

            allDone.Set();


            Socket listener = (Socket)ar.AsyncState;
            Socket handler = listener.EndAccept(ar);


            StateObject state = new StateObject();
            state.WorkSocket = handler;

            // Begin to receive the file from the server.
            handler.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
            flag = 0;
        }

        string fileSavePath = string.Empty;

        /// <summary>
        /// Receive the file send by the server.
        /// </summary>
        public   void ReadCallback(IAsyncResult ar)
        {
           
            int fileNameLen = 1;
            String content = String.Empty;
            StateObject state = (StateObject)ar.AsyncState;
            Socket handler = state.WorkSocket;
            int bytesRead = handler.EndReceive(ar);
           

            try
            {
                if (bytesRead > 0)
                {

                    if (flag == 0)
                    {

                        //create the folder for saving if needed

                        if (!Directory.Exists(folderSavePath))
                        {
                            Directory.CreateDirectory(folderSavePath);
                        }

                        // Get the filename length from the server.
                        fileNameLen = BitConverter.ToInt32(state.Buffer, 0);
                        string fileName = Encoding.UTF8.GetString(state.Buffer, 4, fileNameLen);

                        fileSavePath = folderSavePath + "\\" + fileName;
                        flag++;
                    }
                    if (flag >= 1)
                    {
                        using (BinaryWriter writer = new BinaryWriter(File.Open(fileSavePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)))
                        {
                            if (flag == 1)
                            {
                                writer.Write(state.Buffer, 4 + fileNameLen, bytesRead - (4 + fileNameLen));
                                flag++;
                            }
                            else
                                writer.Write(state.Buffer, 0, bytesRead);

                            writer.Flush();
                            writer.Close();
                        }

                            handler.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0,
                            new AsyncCallback(ReadCallback), state);
                        
                    }

                }
                else
                {
                    handler.Close();
                }
            }
            catch(Exception ex)
            {

            }

        }

      
    }

    }



What I have tried:

I tried to develope a tcp sender that send multiple large files over TCP,
and a receiver, that listen and get the files from TCP and save them to disk.

解决方案

Just take a short look at your code:

the file is being used by another process


It means your file is being read, and you want to read it again at the same time.

Read once, split it in many blocks, and send this block.


这篇关于通过TCP发送和接收多个文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆