| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1652 人关注过本帖
标题:C#SOCKET服务器的问题
只看楼主 加入收藏
pan973
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2009-4-24
结帖率:66.67%
收藏
 问题点数:0 回复次数:6 
C#SOCKET服务器的问题
调用:
            IPEndPoint local = new IPEndPoint("127.0.0.1", 8050);
            serverListener = new TcpListener(local);      
                    MessageBox.Show("开始了");
                    serverListener.Start();


                    thListen = new Thread(new ThreadStart(ServerListen));
                    thListen.Start();
函数
private void ServerListen()
        {
            
            while (true)
            {
                tcpClient = serverListener.AcceptTcpClient();

                int a = 0;
                byte[] buffer = new byte[1024];
                NetworkStream stream = tcpClient.GetStream();
                try
                {
                    a = stream.Read(buffer, 0, 1024);   
                    string temp = "", message = "";
                    if (a > 0)
                    {
                        temp = System.Text.Encoding.ASCII.GetString(buffer, 0, a);
                        message += temp;

                        message = Encoding.ASCII.GetString(buffer, 0, a);

                        MessageBox.Show("接收到" + message);
                    }
                    else
                    {
                        //tcpClient.Close();
                        MessageBox.Show("断开");
                    

                    }
                    //stream.Close();//这个如果使用的话,服务器一接到数据,客户端就会被关掉
                }
                catch (Exception ex)
                {
                    //TODO:接收数据线程异常处理
                    
                    MessageBox.Show(ex.Message);

                }
            }
        }

经过我多次。。无数次实验后发现
当tcpClient = serverListener.AcceptTcpClient();在while里面时,服务器可以接收(处理)同一客户端发送的多个请求

当tcpClient = serverListener.AcceptTcpClient();在while外面时,服务器可以接收(处理)多一客户端发送的一个请求


哪位大大能不能帮帮我改看看,使其可以接收(处理)多一客户端发送的多个请求,本人新人,所以呢,希望各位大大给意见时不要随口说说,最好能帮改下,谢谢了
搜索更多相关主题的帖子: 服务器 SOCKET 
2009-09-21 08:10
乖老鼠
Rank: 5Rank: 5
来 自:四川省
等 级:职业侠客
威 望:2
帖 子:434
专家分:394
注 册:2008-9-8
收藏
得分:0 
当tcpClient = serverListener.AcceptTcpClient();在while外面时,serverListener.AcceptTcpClient()方法只会执行一次,也就是说这个线程只能处理一个客户端的一次连接请求,一旦连接成功以后,就会进入while不断循环,怎么会像你说的,能处理多个?

要处理多个同时接入,你需要为每一个连接都创建一个线程来处理,这样可以让while循环马上进入下一次循环。否则,同时有多个客户端接入就会出现第一个接入成功后,后面的一直无法Connected成功。

大致要做2步:
1、tcpClient = serverListener.AcceptTcpClient();必须放到while循环内部;
2、一旦获得新的客户端接入,为这个接入创建一个线程去处理网络数据。

下面是修改后的代码
(代码是直接回帖写的,没在开发环境下写,如果有错误你自己调试修改下)
程序代码:
private void ServerListen() 
{ 
            
     while (true) 
     { 
           tcpClient = serverListener.AcceptTcpClient(); 
           Thread tcpthread=new Thread(DoSomeThing);//创建新线程,这样程序可以立刻进入下一次while循环,处理新的客户端接入
           tcpthread.Start(tcpClient);//把新获得的连接作为参数传过去(其实也可以不传,因为你的tcpClient是全局的
     } 
} 
///
///为每一个客户端接入创建的处理线程
///
private void DoSomeThing(object parmater)
{
    TcpClinet newTcpClient= parmater as TcpClinet ;//将参数转换成TcpClinet 
    int a = 0; 
    byte[] buffer = new byte[1024]; 
    NetworkStream stream = newTcpClient.GetStream(); //
    try 
    { 
                    a = stream.Read(buffer, 0, 1024);    
                    string temp = "", message = ""; 
                    if (a > 0) 
                    { 
                        temp = System.Text.Encoding.ASCII.GetString(buffer, 0, a); 
                        message += temp; 

                        message = Encoding.ASCII.GetString(buffer, 0, a); 

                        MessageBox.Show("接收到" + message); 
                    } 
                    else 
                    { 
                        //tcpClient.Close(); 
                        MessageBox.Show("断开"); 
                    

                    } 
                    //stream.Close();//这个如果使用的话,服务器一接到数据,客户端就会被关掉 
       } 
       catch (Exception ex) 
       { 
                    //TODO:接收数据线程异常处理 
                    
                    MessageBox.Show(ex.Message); 

       } 
}



[ 本帖最后由 乖老鼠 于 2009-9-22 11:47 编辑 ]

转眼就从编程菜鸟混成了半灌水
2009-09-22 11:27
乖老鼠
Rank: 5Rank: 5
来 自:四川省
等 级:职业侠客
威 望:2
帖 子:434
专家分:394
注 册:2008-9-8
收藏
得分:0 
LZ真是一毛不拔啊,帖子都不赏分
收到的鲜花
  • pan9732009-09-22 14:09 送鲜花  3朵   附言:我很赞同---我还不会结贴

转眼就从编程菜鸟混成了半灌水
2009-09-22 11:48
pan973
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2009-4-24
收藏
得分:0 
sorry 我今天才上的,呵呵
2009-09-22 14:06
pan973
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2009-4-24
收藏
得分:0 
弱弱的问一句,怎么结帖啊,,,,,,
2009-09-22 14:15
pan973
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2009-4-24
收藏
得分:0 
我测试过了,必须在DoSomeThing在加个循环,我改了一下,如:
private void DoSomeThing(object parmater)
{
    TcpClient newTcpClient= parmater as TcpClient ;//将参数转换成TcpClinet  
    int a = 0;  
    byte[] buffer = new byte[1024];  
    NetworkStream stream = newTcpClient.GetStream(); //
    while (true)
    {
        try
        {
            a = stream.Read(buffer, 0, 1024);
            string temp = "", message = "";
            if (a > 0)
            {
                temp = System.Text.Encoding.ASCII.GetString(buffer, 0, a);
                message += temp;
 
                message = Encoding.ASCII.GetString(buffer, 0, a);
 
                MessageBox.Show("接收到" + message);
            }
            else
            {
                newTcpClient.Close();  
                MessageBox.Show("断开");
                break;
 
            }
            //stream.Close();//这个如果使用的话,服务器一接到数据,客户端就会被关掉  
        }
        catch (Exception ex)
        {
            //TODO:接收数据线程异常处理  
 
            MessageBox.Show(ex.Message);
 
        }
    }
}
我试了下,很是符合我的要求
谢谢“乖老鼠”
2009-09-22 14:26
乖老鼠
Rank: 5Rank: 5
来 自:四川省
等 级:职业侠客
威 望:2
帖 子:434
专家分:394
注 册:2008-9-8
收藏
得分:0 
以下是引用pan973在2009-9-22 14:26的发言:

我测试过了,必须在DoSomeThing在加个循环,我改了一下,如:
private void DoSomeThing(object parmater)
{
    TcpClient newTcpClient= parmater as TcpClient ;//将参数转换成TcpClinet  
    int a = 0;  
   ..
刚好我自己才完成了一个即时通讯工具的开发,所以略懂一些。

转眼就从编程菜鸟混成了半灌水
2009-09-22 16:16
快速回复:C#SOCKET服务器的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021405 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved