本帖最后由 VisualEleven 于 2010-12-09 11:31:47 编辑

解决方案 »

  1.   

    socket1.Listen(0);->socket1.Listen(大于0);
     byte[] recvBytes = new byte[4];
    接收字节是否太小,接收不完整
      

  2.   

    没有必要 Socket temp = socket1.Accept();
      

  3.   


    看到这样的思路,就不可能到一个真正做服务器系统的团队里去开发。这是网上做着玩的一些业余开发服务程序的人的demo的思路。
      

  4.   

    你自己想想,哪些真正的互联网上的业务服务器,比如移动公司的支持会话的吧,它没事的时候一直跟每一个潜在的客户端去保持联系?那么得多大的服务器啊。如果Csdn的服务器需要支持2亿人可以访问于是一开机就要保持2亿个线程、2亿个socket,成了什么?
      

  5.   

    先谢谢您的指正。
    我确实是初学者,我还有疑问是,采用TCP/IP,通信时,如果没有服务器一直开着,怎么才能保证不会丢失客户端发来的消息呢?请指教
      

  6.   

    先去看看基础的知识..我知道楼主的难处.2个月以前.我用c# 做通信啥都写不出来...
    单我看了4天的通信的基础知识.我就开始写网络版的斗地主了.而且1个月就已经写完了.
    建议楼主想写通信的小代码的时候.先看看基础知识.socket通信.同步,异步...慢慢来..然后心跳.堵塞处理...等等等...
    等你看完.明白原理...写起来就非常简单了.就不会遇到现在的这些问题.
      

  7.   

    QQ最高的那天不是1亿同时在线吗?服务器不会开1亿个线程,客户端也是每隔一定时间去服务器一下。具体还要问sp。呵呵
      

  8.   


     谢谢你的解答,我是这两天一定要这个功能,才这么着急
    希望你能给些解答,不胜感激:
    我现在成这样:服务器端button1_Click_1,打开端口,然后 button2_Click进循环监听;public Form1()
            {
                InitializeComponent();
            }        Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);        private void button1_Click_1(object sender, EventArgs e)
            {
                int port = 2000;
                string hostip = "192.168.0.2";
                IPAddress ip = IPAddress.Parse(hostip);
                IPEndPoint ipe = new IPEndPoint(ip, port);
                socket1.Bind(ipe);
                
            }        private void button2_Click(object sender, EventArgs e)
            {            while (true)
                {
                    socket1.Listen(15);
                    byte[] recvBytes = new byte[1024];
                    int rNum = socket1.Receive(recvBytes, recvBytes.Length, SocketFlags.None);
                    if (rNum > 0)
                    {
                        string recvStr = Encoding.ASCII.GetString(recvBytes, 0, rNum);
                        textBox1.Text = recvStr;
                    }
                }
            }client端:button2_Click 每次发送一次。
      Socket socket1 = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    int port = 2000;
                    string hostip = "192.168.0.3";
                    IPAddress ip = IPAddress.Parse(hostip);
                    IPEndPoint ipe = new IPEndPoint(ip, port);
                    Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    socket1.Connect(ipe);
                    string s;
                    s = textBox1.Text;
                    byte[] bs = Encoding.ASCII.GetBytes(s);
                    socket1.Send(bs, bs.Length, System.Net.Sockets.SocketFlags.None);
                }
                catch
                {
                    MessageBox.Show("send fall");
                }          
                
             }        private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    int port = 2000;
                    string hostip = "192.168.0.3";
                    IPAddress ip = IPAddress.Parse(hostip);
                    IPEndPoint ipe = new IPEndPoint(ip, port);
                    Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    socket1.Connect(ipe);          
                }
                catch
                {
                    MessageBox.Show("client connect fall");
                }        }        private void button3_Click(object sender, EventArgs e)
            {
                socket1.Shutdown(SocketShutdown.Both);
                socket1.Close();
            }        private void button3_Click(object sender, EventArgs e)
            {
                socket1.Shutdown(SocketShutdown.Both);
                socket1.Close();
            }
        }
    我的疑问有:
    1.现在client端可以将数据发送出来,我是用一个网口调试助手监测的,能接受到数据,但是如果将
       private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    string s;
                    s = textBox1.Text;
                    byte[] bs = Encoding.ASCII.GetBytes(s);
                    socket1.Send(bs, bs.Length, System.Net.Sockets.SocketFlags.None);
                }
                catch
                {
                    MessageBox.Show("send fall");
                }          
                
             }
    改为这样,则不能发送了,很不解,每次发送都需要连接一次吗?问题2:
    现在的服务器端不能接受到数据,我是按照某个Demo写的,很困惑,listen是阻塞的吗?运行起来告诉我没有连接,我想的服务器是不需要连接吧,只要听就行了,不是吗?等待前辈解答!!!!
      

  9.   


    经典select模型就是1个线程死循环侦听. 然后调用 一些系统提供的非阻塞读,写方法进而实现 为N个客户端服务.
    楼主代码固然太DEMO,你恐怕也是过于武断.因为你引用的这段话至少从网络编程上来看没有任何问题.
      

  10.   

    有个例子,你试试看。
    去这里看看  资源
    看看这个资源:C#简单的socket示例