Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步tcp套接字中的文件已损坏_C# - Fatal编程技术网

C# 异步tcp套接字中的文件已损坏

C# 异步tcp套接字中的文件已损坏,c#,C#,创建了一个异步tcp客户机和服务器,当传输文本文件而不是二进制文件时,程序工作正常。发送和接收的字节数匹配,但二进制文件无法运行。pdf内容为空,zip无法提取等。任何提示,谢谢 客户 using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.Text; using System.IO; // State object for receiving data fro

创建了一个异步tcp客户机和服务器,当传输文本文件而不是二进制文件时,程序工作正常。发送和接收的字节数匹配,但二进制文件无法运行。pdf内容为空,zip无法提取等。任何提示,谢谢

客户

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text;
using System.IO;

// State object for receiving data from remote device.
public class StateObject
{
    // Client socket.
    public Socket workSocket = null;
    // Size of receive buffer.
    public const int BufferSize = 256;
    // Receive buffer.
    public byte[] buffer = new byte[BufferSize];
    // Received data string.
    public StringBuilder sb = new StringBuilder();
}

public class AsynClient
{
    // The port number for the remote device.
    private const int port = 11000;

    // ManualResetEvent instances signal completion.
    private static ManualResetEvent connectDone = new ManualResetEvent(false);
    private static ManualResetEvent sendDone = new ManualResetEvent(false);
    private static ManualResetEvent receiveDone = new ManualResetEvent(false);

    // The response from the remote device.
    private static String response = String.Empty;
    private static String endofFile = "<EOF>";

    private static void StartClient()
    {
        // Connect to a remote device.
        try
        {
            // Establish the remote endpoint for the socket.
            // The name of the 
            // remote device is "host.contoso.com".
            IPHostEntry ipHostInfo = Dns.Resolve("128.127.12.41");
            IPAddress ipAddress = ipHostInfo.AddressList[0];            
            IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);

            // Create a TCP/IP socket.
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // Connect to the remote endpoint.
            client.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), client);
            connectDone.WaitOne();

            // Send test data to the remote device.
            //Send(client, "This is a test<EOF>");
            Send(client, readFile());
            sendDone.WaitOne();

            // Receive the response from the remote device.
            Receive(client);
            receiveDone.WaitOne();

            // Write the response to the console.
            Console.WriteLine("Response received : {0}", response);

            // Release the socket.
            client.Shutdown(SocketShutdown.Both);
            client.Close();

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    //private static String readFile()
    private static byte[] readFile()
    {
        String filePath = "C:\\way\\interface\\";
        //String fileName = "DC5_2013-04-08_20130828111230.zip";
        String fileName = "DC5_2013-06-01_20130828183818.zip";

        fileName = fileName.Replace("\\", "/");
        while (fileName.IndexOf("/") > -1)
        {
            filePath += fileName.Substring(0, fileName.IndexOf("/") + 1);
            fileName = fileName.Substring(fileName.IndexOf("/") + 1);
        }

        byte[] fileNameByte = Encoding.ASCII.GetBytes(fileName);        
        if (fileNameByte.Length > 850 * 1024)
        {            
            Console.WriteLine("File size is more than 850kb, please try with small file.");            
        }

        byte[] fileNameLen = BitConverter.GetBytes(fileNameByte.Length);

        byte[] fileData = File.ReadAllBytes(filePath + fileName);        
        byte[] eofByte = Encoding.ASCII.GetBytes(endofFile);

        byte[] clientData = new byte[4 + fileNameByte.Length + fileData.Length + endofFile.Length];

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

        //return System.Text.Encoding.Default.GetString(clientData);
        return clientData;
    }

    private static void ConnectCallback(IAsyncResult ar)
    {
        try
        {
            // Retrieve the socket from the state object.
            Socket client = (Socket)ar.AsyncState;

            // Complete the connection.
            client.EndConnect(ar);

            Console.WriteLine("Socket connected to {0}", client.RemoteEndPoint.ToString());

            // Signal that the connection has been made.
            connectDone.Set();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    private static void Receive(Socket client)
    {
        try
        {
            // Create the state object.
            StateObject state = new StateObject();
            state.workSocket = client;

            // Begin receiving the data from the remote device.
            client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReceiveCallback), state);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    private static void ReceiveCallback(IAsyncResult ar)
    {
        try
        {
            // Retrieve the state object and the client socket 
            // from the asynchronous state object.
            StateObject state = (StateObject)ar.AsyncState;
            Socket client = state.workSocket;

            // Read data from the remote device.
            int bytesRead = client.EndReceive(ar);

            if (bytesRead > 0)
            {
                // There might be more data, so store the data received so far.
                state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));

                // Get the rest of the data.
                client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                    new AsyncCallback(ReceiveCallback), state);
            }
            else
            {
                // All the data has arrived; put it in response.
                if (state.sb.Length > 1)
                {
                    response = state.sb.ToString();
                }
                // Signal that all bytes have been received.
                receiveDone.Set();
            }
        }
        catch (Exception e)
        {
            //Console.WriteLine(e.ToString());

            StateObject state = (StateObject)ar.AsyncState;
            if (state.sb.Length > 1)
            {
                response = state.sb.ToString();
            }
            // Signal that all bytes have been received.
            receiveDone.Set();             
        }
    }

    private static void Send(Socket client, byte[] byteData)
    {        
        // Begin sending the data to the remote device.
        client.BeginSend(byteData, 0, byteData.Length, 0,
            new AsyncCallback(SendCallback), client);
    }

    private static void Send(Socket client, String data)
    {
        // Convert the string data to byte data using ASCII encoding.
        byte[] byteData = Encoding.ASCII.GetBytes(data);

        // Begin sending the data to the remote device.
        client.BeginSend(byteData, 0, byteData.Length, 0,
            new AsyncCallback(SendCallback), client);
    }

    private static void SendCallback(IAsyncResult ar)
    {
        try
        {
            // Retrieve the socket from the state object.
            Socket client = (Socket)ar.AsyncState;

            // Complete sending the data to the remote device.
            int bytesSent = client.EndSend(ar);
            Console.WriteLine("Sent {0} bytes to server.", bytesSent);

            // Signal that all bytes have been sent.
            sendDone.Set();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

    public static int Main(String[] args)
    {
        StartClient();
        return 0;
    }
}
使用系统;
Net系统;
使用System.Net.Sockets;
使用系统线程;
使用系统文本;
使用System.IO;
//用于从远程设备接收数据的状态对象。
公共类状态对象
{
//客户端套接字。
公共套接字工作组=null;
//接收缓冲区的大小。
public const int BufferSize=256;
//接收缓冲区。
公共字节[]缓冲区=新字节[BufferSize];
//接收到的数据字符串。
公共StringBuilder sb=新StringBuilder();
}
公共类异步客户端
{
//远程设备的端口号。
专用常量int端口=11000;
//ManualResetEvent实例信号完成。
专用静态手动复位事件连接完成=新手动复位事件(错误);
专用静态手动复位事件sendDone=新手动复位事件(false);
private static ManualResetEvent receiveDone=新的ManualResetEvent(错误);
//来自远程设备的响应。
私有静态字符串响应=String.Empty;
私有静态字符串endofFile=“”;
私有静态void StartClient()
{
//连接到远程设备。
尝试
{
//为套接字建立远程端点。
//名称
//远程设备是“host.contoso.com”。
IPHostEntry ipHostInfo=Dns.Resolve(“128.127.12.41”);
IPAddress IPAddress=ipHostInfo.AddressList[0];
IPEndPoint remoteEP=新IPEndPoint(ipAddress,端口);
//创建TCP/IP套接字。
Socket client=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
//连接到远程端点。
BeginConnect(remoteEP,新的异步回调(ConnectCallback),client);
connectDone.WaitOne();
//将测试数据发送到远程设备。
//发送(客户端,“这是一个测试”);
发送(客户端,readFile());
sendDone.WaitOne();
//从远程设备接收响应。
接收(客户);
receiveDone.WaitOne();
//将响应写入控制台。
WriteLine(“收到的响应:{0}”,响应);
//松开插座。
client.Shutdown(SocketShutdown.Both);
client.Close();
}
捕获(例外e)
{
Console.WriteLine(如ToString());
}
}
//私有静态字符串readFile()
私有静态字节[]readFile()
{
String filePath=“C:\\way\\interface\\”;
//字符串fileName=“DC5_2013-04-08_20130828111230.zip”;
字符串fileName=“DC5_2013-06-01_20130828183818.zip”;
fileName=fileName.Replace(“\\”,“/”);
while(fileName.IndexOf(“/”>-1)
{
filePath+=fileName.Substring(0,fileName.IndexOf(“/”)+1);
fileName=fileName.Substring(fileName.IndexOf(“/”)+1);
}
byte[]fileNameByte=Encoding.ASCII.GetBytes(文件名);
如果(fileNameByte.Length>850*1024)
{            
WriteLine(“文件大小超过850kb,请尝试使用小文件。”);
}
byte[]fileNameLen=BitConverter.GetBytes(fileNameByte.Length);
byte[]fileData=File.ReadAllBytes(文件路径+文件名);
字节[]eofByte=Encoding.ASCII.GetBytes(endofFile);
byte[]clientData=新字节[4+fileNameByte.Length+fileData.Length+endofile.Length];
fileNameLen.CopyTo(clientData,0);
CopyTo(clientData,4);
CopyTo(clientData,4+fileNameByte.Length);
CopyTo(clientData,4+fileNameByte.Length+fileData.Length);
//返回System.Text.Encoding.Default.GetString(clientData);
返回clientData;
}
专用静态无效连接回调(IAsyncResult ar)
{
尝试
{
//从状态对象检索套接字。
套接字客户端=(套接字)ar.AsyncState;
//完成连接。
客户端.EndConnect(ar);
WriteLine(“连接到{0}的套接字”,client.RemoteEndPoint.ToString());
//表示已建立连接的信号。
connectDone.Set();
}
捕获(例外e)
{
Console.WriteLine(如ToString());
}
}
私有静态void接收(套接字客户端)
{
尝试
{
//创建状态对象。
StateObject状态=新的StateObject();
state.workSocket=客户端;
//开始从远程设备接收数据。
client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
新建异步回调(ReceiveCallback),状态);
}
捕获(例外e)
{
Console.WriteLine(如ToString());
}
}
私有静态void ReceiveCallback(IAsyncResult ar)
{
尝试
{
//检索状态对象和客户端套接字
//从异步状态对象。
StateObject状态=(StateObject)ar.AsyncState;
套接字客户端=state.workSocket;
//从远程设备读取数据。
int bytesRead=client.EndReceive(ar);
如果(字节读取>0)
{
//可能会有更多数据,因此请存储到目前为止收到的数据。
state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead));
//获取其余的数据。
client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.IO;

// State object for reading client data asynchronously
public class StateObject
{
    // Client  socket.
    public Socket workSocket = null;
    // Size of receive buffer.
    public const int BufferSize = 860 * 1024;
    // Receive buffer.
    public byte[] buffer = new byte[BufferSize];
    // Received data string.
    public StringBuilder sb = new StringBuilder();
}

public class AsynServer
{
    // Thread signal.
    public static ManualResetEvent allDone = new ManualResetEvent(false);
    public static string receivedPath = "C:/way/dw";
    private static String endofFile = "<EOF>";

    public AsynServer()
    {
    }

    public static void StartListening()
    {
        // Data buffer for incoming data.
        byte[] bytes = new Byte[1024];

        // Establish the local endpoint for the socket.
        // The DNS name of the computer
        // running the listener is "host.contoso.com".
        IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

        // Create a TCP/IP socket.
        Socket listener = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);

        // Bind the socket to the local endpoint and listen for incoming connections.
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(100);

            while (true)
            {
                // Set the event to nonsignaled state.
                allDone.Reset();

                // Start an asynchronous socket to listen for connections.
                Console.WriteLine("Waiting for a connection...");
                listener.BeginAccept(
                    new AsyncCallback(AcceptCallback),
                    listener);

                // Wait until a connection is made before continuing.
                allDone.WaitOne();
            }

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }

        Console.WriteLine("\nPress ENTER to continue...");
        Console.Read();

    }

    public static void AcceptCallback(IAsyncResult ar)
    {
        // Signal the main thread to continue.
        allDone.Set();

        // Get the socket that handles the client request.
        Socket listener = (Socket)ar.AsyncState;
        Socket handler = listener.EndAccept(ar);

        // Create the state object.
        StateObject state = new StateObject();
        state.workSocket = handler;
        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(ReadCallback), state);
    }

    public static void ReadCallback(IAsyncResult ar)
    {
        String content = String.Empty;        

        // Retrieve the state object and the handler socket
        // from the asynchronous state object.
        StateObject state = (StateObject)ar.AsyncState;
        Socket handler = state.workSocket;

        // Read data from the client socket. 
        int bytesRead = handler.EndReceive(ar);

        if (bytesRead > 0)
        {            
            // There  might be more data, so store the data received so far.
            state.sb.Append(Encoding.ASCII.GetString(
                state.buffer, 0, bytesRead));            

            // Check for end-of-file tag. If it is not there, read 
            // more data.
            content = state.sb.ToString();            
            //Console.WriteLine(content);
            if (content.IndexOf("<EOF>") > -1)
            {
                // All the data has been read from the 
                // client. Display it on the console.
                //Console.WriteLine("Read {0} bytes from socket. \n Data : {1}", content.Length, content);
                Console.WriteLine("Read {0} bytes from socket.", content.Length);

                byte[] byteStream = System.Text.Encoding.UTF8.GetBytes(state.sb.ToString());
                int fileNameLen = BitConverter.ToInt32(byteStream, 0);                
                String fileName = Encoding.ASCII.GetString(byteStream, 4, fileNameLen);                

                writeFile(fileName, fileNameLen, byteStream.Length, byteStream);                


                // Echo the data back to the client.
                //Send(handler, content);
                Send(handler, "OK");
            }
            else
            {
                // Not all data received. Get more.
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                new AsyncCallback(ReadCallback), state);
            }
        }
    }

    private static void writeFile(String fileName, int fileNameLen, int receiveByte, byte[] receiveBuffer)
    {        
        BinaryWriter bWrite = new BinaryWriter(File.Open(receivedPath + "/" + fileName, FileMode.Append));                
        bWrite.Write(receiveBuffer, 4 + fileNameLen, receiveByte - 4 - fileNameLen - endofFile.Length);
        bWrite.Close();
    }

    private static void Send(Socket handler, String data)
    {
        // Convert the string data to byte data using ASCII encoding.
        byte[] byteData = Encoding.ASCII.GetBytes(data);

        // Begin sending the data to the remote device.
        handler.BeginSend(byteData, 0, byteData.Length, 0,
            new AsyncCallback(SendCallback), handler);
    }

    private static void SendCallback(IAsyncResult ar)
    {
        try
        {
            // Retrieve the socket from the state object.
            Socket handler = (Socket)ar.AsyncState;

            // Complete sending the data to the remote device.
            int bytesSent = handler.EndSend(ar);
            Console.WriteLine("Sent {0} bytes to client.", bytesSent);

            handler.Shutdown(SocketShutdown.Both);
            handler.Close();

        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }


    public static int Main(String[] args)
    {
        StartListening();
        return 0;
    }
}
        // There  might be more data, so store the data received so far.
        state.sb.Append(Encoding.ASCII.GetString(
            state.buffer, 0, bytesRead));