首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

*紧急高分请问,请SOCKET高手出手帮忙呀(顶帖有分)*

2012-01-01 
****紧急:高分请教,请SOCKET高手出手帮忙呀(顶帖有分)******为什么我的SOCKET侦听的时候,发送了3个信息或

****紧急:高分请教,请SOCKET高手出手帮忙呀(顶帖有分)******
为什么我的SOCKET侦听的时候,发送了3个信息或者2个信息到端口,我只能收到其中的一个信息呢?帮看看有什么不妥的么?

能附带帮忙回答一下,如何让服务器主动给下面的客户端,发送信息呢?是不是要一直保持着Accept()出来的端口呢?

SOCKET没有搞过,希望高手帮忙呀!

我的服务器端侦听端口的部分代码如下:

我是使用BackgroundWorker   打开和侦听端口的:

  private   void   FORM1_Load(object   sender,   EventArgs   e)
                {
                        BackgroundWorker   bwReceiver   =   new   BackgroundWorker();
                        bwReceiver.DoWork   +=   new   DoWorkEventHandler(ListenLocalHost1);
                        bwReceiver.RunWorkerAsync();
}

                private   void   ListenLocalHost1(object   sender,   DoWorkEventArgs   e)
                {
                        BeginListenClient(3231);
                }

  private   void   BeginListenClient(int   iPort)
                {

                        try
                        {
                                int   port   =   iPort;
                                string   host   =   "192.168.16.161 ";
                                IPAddress   ip   =   IPAddress.Parse(host);
                                IPEndPoint   ipe   =   new   IPEndPoint(ip,   port);
                                Socket   s   =   new   Socket(AddressFamily.InterNetwork,   SocketType.Stream,   ProtocolType.Tcp);//创建一个Socket类
                                s.Bind(ipe);//绑定端口
                                s.Listen(0);//开始监听
                                CommandDataExchange_New.CreatErrorFile( "开始侦听端口: "   +   iPort.ToString());

                                Socket   clientSocket   =   null;
                                while   (true)      
                                {
                                        try


                                        {
                                                clientSocket   =   s.Accept();
                                                while   (clientSocket.Connected)
                                                {
                                                        string   recvStr   =   " ";
                                                        if   (clientSocket.Available   ==   0)
                                                        {
                                                                continue;
                                                        }

                                                        byte[]   recvBytes   =   new   byte[clientSocket.Available];
                                                        int   bytes;
                                                        IAsyncResult   iarTemp   =   clientSocket.BeginReceive(recvBytes,   0,   recvBytes.Length,   SocketFlags.None,   null,   null);//从客户端接受信息
                                                        while   (!iarTemp.IsCompleted)
                                                        {
                                                                continue;
                                                        }


                                                        IPEndPoint   ipeTemp   =   (IPEndPoint)clientSocket.RemoteEndPoint;

                                                        string   sOld   =   " ";
                                                        foreach   (byte   bTemp   in   recvBytes)
                                                        {
                                                                sOld   =   sOld   +   ((char)bTemp).ToString();
                                                        }

                                                        CommandDataExchange_New.CreatErrorFile( "端口: "   +   iPort.ToString()   +   "收到十进制数据:   "   +   sOld);                                          
                                                        break;
                                                }

                                                if   (clientSocket   !=   null   &&   clientSocket.Connected)
                                                {
                                                        try
                                                        {
                                                                clientSocket.Shutdown(SocketShutdown.Both);
                                                                clientSocket.Close();


                                                        }
                                                        catch
                                                        {
                                                        }
                                                }
                                        }
                                        catch   (Exception   ex)
                                        {
                                                MessageBox.Show( "listening   Error:   "   +   ex.Message);
                                        }
                                }
                        }
                        catch   (Exception   ex)
                        {
                                MessageBox.Show( "端口打开发生错误!\n "   +   ex.Message);
                        }
                }

[解决办法]
是否发送的信息间隔时间太短?
[解决办法]
UP
[解决办法]
建议你在每接收一个消息时采用启动一个线程

[解决办法]
建议你在每接收一个消息时采用启动一个线程
-----------------------------------------
这样不行,建议采用异步进行处理!
[解决办法]
up
[解决办法]
接分,按照异步来写的话安说是不会有这样的情况
ref
http://blog.csdn.net/red_angelx/archive/2006/10/17/1337924.aspx
[解决办法]
帮顶!
------解决方案--------------------


多线程处理觉得比较好
接收到消息创建一个新的线程处理它
[解决办法]
接分~~~
偶 不是高手,只能帮忙顶贴~~~
[解决办法]
up
[解决办法]
只能收到第一個消息還是最後一個消息?
感覺内層while循環中兩次continue 和一次break會有問題。
[解决办法]
建议用异步方式
[解决办法]
结构就不是很好,异步也是这样,byte[]转化也是,

应该先封装一下,异步发送和接收都应该在线程池中进行,发送和接收的消息都应在Queue中.消息至少得有个分隔符吧? 不然粘包怎么办?
[解决办法]
帮顶!

[解决办法]
结构就不是很好,异步也是这样,byte[]转化也是,

应该先封装一下,异步发送和接收都应该在线程池中进行,发送和接收的消息都应在Queue中.消息至少得有个分隔符吧? 不然粘包怎么办?
-------------------------

你用Socket 来进宪通信。不可能传送的全是些字符吧,
至少你得把数据封装成一个一个的数据包啊。也就是一个个网络传输对象/
每次把接收的对象放到Queue里去有问题么????????
[解决办法]
Optione(找个工作太难了) ( ) 信誉:100 2007-09-07 11:05:52 得分: 0
------------------------------------

结构就不是很好,异步也是这样,byte[]转化也是,

应该先封装一下,异步发送和接收都应该在线程池中进行,发送和接收的消息都应在Queue中.消息至少得有个分隔符吧? 不然粘包怎么办?
-----------------------------
呵呵,再回头看了一下,觉得你对Queue对列并不是很理解!
比如说,你把一个个的字符串分别放到数组中去,再从数组中取出来,这样会搞乱吗?????



[解决办法]
楼主应该把同步改成异步的方式,这样如果有并发进入的请求,就可以同时得到处理。
我有一个异步的SOCKET的程序代码,如果楼主需要可以PM我。
[解决办法]
up
[解决办法]
我是菜鸟,谁能帮我解释下这个。。。把楼主的程序简化,去掉TRY CATCH后如下:
private void BeginListenClient(int iPort)
{

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
s.Bind(ipe);//绑定端口
s.Listen(0);//开始监听
Socket clientSocket = null;
while (true)
{

clientSocket = s.Accept();
while (clientSocket.Connected)
{
}
if (clientSocket != null && clientSocket.Connected)
{

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


}

}

}

这个。。。。什么情况下可以让内圈While结束循环后还能执行IF里面的Socket.close()啊。。。
[解决办法]
顶 ……期待学习
[解决办法]
to jess_lv

不太明白你的意思?

你可以有个MessageBuffer类,类中比如有个byte[] m_buffer;这就是要发送的对象.

一系列的MessageBuffer在Queue中排队,
当你发完一个MessageBuffer后,再去用Queue的Dequeue方法弹出一个MessageBuffer发送,直到全部发送完毕.


[解决办法]
这是阻塞方式,当有连接进来才会接收信息,改为非阻塞方式,就行了
------解决方案--------------------


顶,还没用过异步,呵呵,学习下
[解决办法]
顶一下.
[解决办法]
用异步,可以发你个代码,QQ:75786749
[解决办法]
给楼主几点键议:
1、使用异步模式。
2、发送的数据应当封装。
3、接收数据用的缓冲区应当是固定的。
4、看看我的BLOG:http://wzd24.cnblogs.com。

热点排行