读书人

*紧急高分请问,请SOCKET高手出手帮忙呀

发布时间: 2012-01-01 23:10:55 作者: rapoo

****紧急:高分请教,请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。

读书人网 >C#

热点推荐