小弟第一次接触这方面的东西,好多都没明白,希望有懂这方面知识的大大们给点帮助。偶的QQ467842700    
这个服务器方程序只能接收一次传送的文件,第二次就连接不上了,如何让其可以一直监听。还有就是这个我做了局域网内可以传输,但是外网之间连接不上,请问是怎么回事。
服务器
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.IO;
namespace TestSocketServerHSTF
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();            dataGridView1.AllowUserToAddRows = false;
        }
        Thread TempThread = null;
        private void Form1_Load(object sender, EventArgs e)
        {
            //开启接收线程
            TempThread = new Thread(new ThreadStart(this.StartReceive));
            TempThread.Start();
            
        }        private void StartReceive()
        {
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse("8511"));
            //MessageBox.Show(IPAddress.Any.ToString());
            //创建一个套接字   
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //绑定套接字到端口   
            server.Bind(ipep);            //开始侦听(并堵塞该线程)   
            server.Listen(10);            //确认连接   
            Socket client = server.Accept();
            
            //获得客户端节点对象   
            IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;            //获得[文件名]   
            string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client));
            //MessageBox.Show("文件名" + SendFileName);               //获得[包的大小]   
            string bagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client));
            //MessageBox.Show("包大小" + bagSize);               //获得[包的总数量]   
            int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client)));
            //MessageBox.Show("包的总数量" + bagCount);               //获得[最后一个包的大小]   
            string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.TransferFiles.ReceiveVarData(client));
            //MessageBox.Show("最后一个包的大小" + bagLast);               //创建一个新文件   
            FileStream MyFileStream = new FileStream(SendFileName, FileMode.Create, FileAccess.Write);            //已发送包的个数   
            int SendedCount = 0;            while (true)
            {
                byte[] data = TransferFiles.TransferFiles.ReceiveVarData(client);
                if (data.Length == 0)
                {
                    break;
                }
                else
                {
                    SendedCount++;
                    //将接收到的数据包写入到文件流对象   
                    MyFileStream.Write(data, 0, data.Length);
                    //显示已发送包的个数   
                    //MessageBox.Show("已发送包个数"+SendedCount.ToString());   
                }
            }            //关闭文件流   
            MyFileStream.Close();
            //关闭套接字   
            client.Close();
                        //填加到dgv里   
            //文件大小,IP,已发送包的个数,文件名,包的总量,最后一个包的大小   
            this.dataGridView1.Rows.Add(bagSize, clientep.Address, SendedCount, SendFileName, bagCount, bagLast);
        }        #region   拦截Windows消息,关闭窗体时执行
        protected override void WndProc(ref   Message m)
        {
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_CLOSE = 0xF060;
            if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE)
            {//捕捉关闭窗体消息      
                //   User   clicked   close   button      
                //this.WindowState = FormWindowState.Minimized;//把右上角红叉关闭按钮变最小化                   ServiceStop();
            }
            base.WndProc(ref   m);
        }
        #endregion        #region 停止服务
        //停止服务   
        private void ServiceStop()   
        {   
            try  
            {   
  
            }   
            catch { }   
  
            try  
            {   
  
            }   
            catch { }   
        }  
        #endregion         private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            
        }
    }
}

解决方案 »

  1.   

    客户端
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Collections;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;
    using System.Threading;namespace 发送端
    {
        public partial class Form1 : Form
        {
         
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                //选择要进行传输的文件   
                if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    FileInfo EzoneFile = new FileInfo(this.openFileDialog1.FileName);
                    this.textBox1.Text = EzoneFile.FullName;
                    this.textBox2.Text = EzoneFile.Name;
                    this.textBox3.Text = EzoneFile.Length.ToString();            }           }        //private void EzoneSend_Load(object sender, System.EventArgs e)
            //{
            //    //获得本机的IP地址   
            //    this.textBox4.Text = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();
            //  //this.textBox4.Text=  Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address.ToString();
            //}           private void button2_Click(object sender, EventArgs e)
            {
                //开启文件传输子线程   
                Thread TempThread = new Thread(new ThreadStart(this.StartSend));
                TempThread.Start();
                this.button2.Enabled = false;
                Control.CheckForIllegalCrossThreadCalls = false;
                
            }        private void Form1_Load(object sender, EventArgs e)
            {
                //获得本机的IP地址   
                this.textBox4.Text =Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString();
                 
                
            }        private void StartSend()
            {
                //创建一个文件对象   
                FileInfo EzoneFile = new FileInfo(this.textBox1.Text);
                //打开文件流   
                FileStream EzoneStream = EzoneFile.OpenRead();
                //包的大小   
                int PacketSize = int.Parse(this.textBox6.Text);
                //包的数量   
                int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));
                this.textBox8.Text = PacketCount.ToString();
                this.progressBar1.Maximum = PacketCount;
                //最后一个包的大小   
                int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));
                this.textBox9.Text = LastDataPacket.ToString();            ////创建一个网络端点   
                //IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.1.136"), int.Parse(this.textBox5.Text));               ////MessageBox.Show(IPAddress.Any);               ////创建一个套接字   
                //Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);               //MessageBox.Show(server.ToString());               //指向远程服务端节点   58.248.216.80
                IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(textBox7.Text), int.Parse(this.textBox5.Text));
                //创建套接字   
                Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //连接到发送端   
                client.Connect(ipep);            ////绑定套接字到端口   
                //client.Bind(ipep);               //MessageBox.Show(ipep.ToString());               ////开始侦听(并堵塞该线程)   
                //server.Listen(10);   
                //确认连接   
                //Socket client = server.Accept();               //MessageBox.Show(client.ToString());                           //获得客户端节点对象   
                IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
                //获得客户端的IP地址   
                this.textBox7.Text=clientep.Address.ToString();   
                //发送[文件名]到客户端   
                TransferFiles.TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));
                //发送[包的大小]到客户端   
                TransferFiles.TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));
                //发送[包的总数量]到客户端   
                TransferFiles.TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));
                //发送[最后一个包的大小]到客户端   
                TransferFiles.TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));            //数据包   
                byte[] data = new byte[PacketSize];
                //开始循环发送数据包   
                for (int i = 0; i < PacketCount; i++)
                {
                    //从文件流读取数据并填充数据包   
                    EzoneStream.Read(data, 0, data.Length);
                    //发送数据包   
                    TransferFiles.TransferFiles.SendVarData(client, data);
                    //显示发送数据包的个数   
                    this.textBox10.Text = ((int)(i + 1)).ToString();
                    //进度条值的显示   
                    this.progressBar1.PerformStep();
                }            //如果还有多余的数据包,则应该发送完毕!   
                if (LastDataPacket != 0)
                {
                    data = new byte[LastDataPacket];
                    EzoneStream.Read(data, 0, data.Length);
                    TransferFiles.TransferFiles.SendVarData(client, data);
                    this.progressBar1.Value = this.progressBar1.Maximum;
                }            //关闭套接字   
                client.Close();
                //server.Close();   
                //关闭文件流   
                EzoneStream.Close();
                this.button2.Enabled = true;
                MessageBox.Show("文件传输完毕!");
            } 
        }
    }
      

  2.   

    公共类
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;using System.Net.Sockets;
    using System.Net;
    using System.Windows.Forms;namespace TransferFiles
    {
        public class TransferFiles
        {
            public TransferFiles()
            {        }        public static int SendData(Socket s, byte[] data)
            {
                int total = 0;
                int size = data.Length;
                int dataleft = size;
                int sent;
                while (total < size)
                {
                    sent = s.Send(data, total, dataleft, SocketFlags.None);
                    total += sent;
                    dataleft -= sent;
                }
                return total;
            }        public static byte[] ReceiveData(Socket s, int size)
            {
                int total = 0;
                int dataleft = size;
                byte[] data = new byte[size];
                int recv;
                while (total < size)
                {
                    recv = s.Receive(data, total, dataleft, SocketFlags.None);
                    if (recv == 0)
                    {
                        data = null;
                        break;
                    }                total += recv;
                    dataleft -= recv;
                }
                return data;
            }        public static int SendVarData(Socket s, byte[] data)
            {
                int total = 0;
                int size = data.Length;
                int dataleft = size;
                int sent;
                byte[] datasize = new byte[4];
                datasize = BitConverter.GetBytes(size);
                sent = s.Send(datasize);            while (total < size)
                {
                    sent = s.Send(data, total, dataleft, SocketFlags.None);
                    total += sent;
                    dataleft -= sent;
                }            return total;
            }        public static byte[] ReceiveVarData(Socket s)
            {
                int total = 0;
                int recv;
                byte[] datasize = new byte[4];
                recv = s.Receive(datasize, 0, 4, SocketFlags.None);
                int size = BitConverter.ToInt32(datasize, 0);
                int dataleft = size;
                byte[] data = new byte[size];
                while (total < size)
                {
                    recv = s.Receive(data, total, dataleft, SocketFlags.None);
                    if (recv == 0)
                    {
                        data = null;
                        break;
                    }
                    total += recv;
                    dataleft -= recv;
                }
                return data;
            }
        }
    }