例如:对方开放TCP80端口,怎么把一个“bin”文件复制到对方的机器里去?

解决方案 »

  1.   

    UDPReceive side:
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Diagnostics;
    using System.Text;
    using System.Xml.Serialization;namespace FileReceive
    {
    public class FileRecv
    {
    [Serializable]
    public class FileDetails
    {
    public string FILETYPE = "";
    public long FILESIZE = 0;
    } private static FileDetails fileDet;
    //UdpClient vars
    private static int localPort = 5002;
    private static UdpClient receivingUdpClient = new UdpClient(localPort);
    private static IPEndPoint RemoteIpEndPoint = null;
            private static FileStream fs;
            private static byte[] receiveBytes = new byte[0];
            private static byte[] subreceiveBytes = new byte[0];
    [STAThread]
    static void Main(string[] args)
    {
    //Get the file details
    GetFileDetails();
    //Receive file;
    ReceiveFile();
    } private static void GetFileDetails()
    {
    try
    {
    Console.WriteLine("-----------------Waiting to get File Details!!----------------");
    //Receive File info
                    byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
                    Console.WriteLine("receive file details!!");                XmlSerializer fileSerializer = new XmlSerializer(typeof(FileDetails));
                    MemoryStream stream1 = new MemoryStream();                //Received byte to stream
                    stream1.Write(receiveBytes, 0, receiveBytes.Length);
                    stream1.Position = 0; //IMP                //call the Deserialize method and cast to the object type
                    fileDet = (FileDetails)fileSerializer.Deserialize(stream1);
                    Console.WriteLine("Receive file of type." + fileDet.FILETYPE + " whose size is " + fileDet.FILESIZE.ToString() + " bytes");
    }
    catch (Exception e)
    {
    Console.WriteLine(e.ToString());
    }
    }        public static void ReceiveFile()
            {
                int insertpoint=0,i=0;
                byte[] a = new byte[1];
                try
                {
                    receiveBytes = new byte[fileDet.FILESIZE];
                    Console.WriteLine("--------------Waiting to get File-------------------");                //Receive file
                    //receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
                    //Console.WriteLine("------File received...Saving....");                ////Create temp file from received file extension
                    //fs = new FileStream("temp." + fileDet.FILETYPE, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
                    //fs.Write(receiveBytes, 0, receiveBytes.Length);                //Console.WriteLine("---File Saved----" + receiveBytes.Length.ToString());
                    //Console.WriteLine("---Opening file with associated program----");                //Process.Start(fs.Name); //Opens file with associated program                #region big
                    while (true)
                    {
                        subreceiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
                        Array.Copy(subreceiveBytes, subreceiveBytes.Length - 1, a, 0, 1);
                        string returnData = Encoding.ASCII.GetString(a);
                        if (returnData.IndexOf((char)3) > -1)
                        {
                            Array.Copy(subreceiveBytes, 0, receiveBytes, insertpoint, subreceiveBytes.Length - 1);                        //Convert and display data
                            Console.WriteLine("------File received...Saving....");                        //Create temp file from received file extension
                            fs = new FileStream("temp." + fileDet.FILETYPE, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
                            fs.Write(receiveBytes, 0, receiveBytes.Length);                        Console.WriteLine("---File Saved----" + receiveBytes.Length.ToString());
                            Console.WriteLine("---Opening file with associated program----");                        Process.Start(fs.Name); //Opens file with associated program
                        }
                        else
                        {
                            i++;
                            Console.WriteLine(i.ToString());
                            Array.Copy(subreceiveBytes, 0, receiveBytes, insertpoint, subreceiveBytes.Length);
                            insertpoint += subreceiveBytes.Length;
                        }
                    }
                    #endregion
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
                finally 
                {
                    fs.Close();
                    receivingUdpClient.Close();
                }
            }
    }
    }
      

  2.   

    Send side:
    using System;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Xml.Serialization;
    using System.Diagnostics;
    using System.Threading;namespace FileSender
    {
    public class FileSender
    {
    //File details (Req. for receiver)
    [Serializable]
    public class FileDetails
    {
    public string FILETYPE="";
    public long FILESIZE=0;
    }
    private static FileDetails fileDet = new FileDetails(); //UdpClient - related fields
    private static IPAddress remoteIPAddress;
    private const int remotePort=5002;
    private static UdpClient sender = new UdpClient();
    private static IPEndPoint endPoint;
    //Filestream object
    private static FileStream fs; [STAThread]
    static void Main(string[] args)
    {
    try
    {
    //Get remote IP address and create IPEndPoint
                    //Console.WriteLine("Enter Remote IP address");
                    remoteIPAddress = IPAddress.Parse("127.255.255.255");// IPAddress.Parse(Console.ReadLine().ToString());
    endPoint = new IPEndPoint(remoteIPAddress,remotePort); //Get file path. (IMP:file size should be less than 8K)
                    Console.WriteLine("Enter file path and name to send.");
                    fs = new FileStream(@Console.ReadLine().ToString(), FileMode.Open, FileAccess.Read);                //if (fs.Length > 8192)
                    //{
                    //    Console.WriteLine("This version transfers files with size <8192 bytes");
                    //    sender.Close();
                    //    fs.Close();
                    //    return;
                    //} SendFileInfo();
    Thread.Sleep(2000);                //SendFile();
                    #region big
                    byte[] a = Encoding.ASCII.GetBytes(((char)3).ToString());                long remainlength = fs.Length - (long)(fs.Length / 8192) * 8192 + 1;
                    if (fs.Length > 8192)
                    {
                        for (int i = 0; i < fs.Length / 8192; i++)
                        {
                            byte[] fixbyte = new byte[8192];
                            fs.Read(fixbyte, 0, 8192);
                            SendFile(fixbyte);
                            Console.WriteLine("send " + (i + 1).ToString() + " times");
                        }
                        byte[] remainbyte = new byte[remainlength];
                        fs.Read(remainbyte, 0, (int)remainlength - 1);
                        Array.Copy(Encoding.ASCII.GetBytes(((char)3).ToString()), 0, remainbyte, remainbyte.Length - 1, 1);
                        SendFile(remainbyte);
                    }
                    #endregion                Console.ReadLine();
    }
    catch (Exception e)
    {
    Console.WriteLine(e.ToString());
    }
    } public static void SendFileInfo()
    {
    //Get file type or extension
    fileDet.FILETYPE = fs.Name.Substring((int)fs.Name.Length -3,3);
    //Get file length(futrue purpose)
    fileDet.FILESIZE = fs.Length; XmlSerializer fileSerializer = new XmlSerializer(typeof(FileDetails));
    MemoryStream stream = new MemoryStream();
    //Serialize object
    fileSerializer.Serialize(stream,fileDet);
    //Stream to byte
    stream.Position = 0;
    byte[] bytes = new byte[stream.Length];
    stream.Read(bytes,0,Convert.ToInt32(stream.Length)); Console.WriteLine("Sending file details...");
    //Send file details
                sender.Send(bytes, bytes.Length, endPoint);
    stream.Close();
    } public static void SendFile()
    {
    //Creating a file stream
    byte[] bytes = new byte[fs.Length];
    //stream to bytes
    fs.Read(bytes,0,bytes.Length);
    Console.WriteLine("Sending file...size=" + fs.Length + " bytes");
    try
    {
    sender.Send(bytes,bytes.Length, endPoint);
    }
    catch (Exception e)
    {
    Console.WriteLine(e.ToString());
    }
    finally
    {
    //Clean up
    fs.Close();
    sender.Close();
    }
    Console.Read();
    Console.WriteLine("File sent sucessfully.");
    }        public static void SendFile(byte[] subfilebytes)
            {
                try
                {
                    sender.Send(subfilebytes, subfilebytes.Length, endPoint);
                    //Console.WriteLine(Encoding.ASCII.GetString(subfilebytes));
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
                finally
                {
                    //sender.Close();
                }
                Console.WriteLine("Sub File Part sent sucessfully.");
            }
    }
    }
      

  3.   

    TCP的话除发送接收外其他代码都不用变,TCP最大包是65536,如果文件大于这个需要做拆分,UDP最大是8192
      

  4.   

    to 例如:对方开放TCP80端口,怎么把一个“bin”文件复制到对方的机器里去?如果你想通过http协议来传输文件的话,你需要在对方机器设置某些虚拟目录之类的,你才能通过webclient的方式向对方传输文件;或者更深的一层,你做个socket来监听80端口(会和某些程序有冲突),放到对方机器端来监听socket请求。否则,你只开了80端口,其他什么也不做,一样不能传输文件。