求助:关于C# SOCKET 阻塞的问题!!!!!!!

winco304 2013-06-09 11:14:06
场景是这样的:客户端C# ,服务端JAVA ,通过socket进行数据获取。代码如下
C#客户端:

IPAddress ip = ip = IPAddress.Parse(socket_server_ip);;
//把ip和端口转化为IPEndPoint实例  
IPEndPoint ipe = new IPEndPoint(ip, Convert.ToInt32(socket_server_port));
//创建一个Socket
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
connectDone.Reset();
c.BeginConnect(ipe, new AsyncCallback(ConnectCallback), c); //连接到服务器
connectDone.WaitOne(5000, false); //设置等待时间为5秒钟
if (c.Connected)
{
byte[] bs = Encoding.GetEncoding("gb2312").GetBytes(sendStr + "\r\n");
c.Send(bs, bs.Length, 0);//发送信息
byte[] buffer;
byte[] bufferTemp; //存储未接收全的数组值
byte[] buffer_lasttime; //上一次接收的BUFFER
while (true)
{
buffer = new byte[1024];
try
{
int iBytes = c.Receive(buffer, buffer.Length, 0);//从服务器端接受返回信息
//TODO:接收处理XXXXXXXXXXXXXXXX

Thread.Sleep(10);
}
catch (ArgumentNullException ex)
{
logg.Error("ArgumentNullException:" + ex.ToString());
}
catch (ArgumentOutOfRangeException ex)
{
logg.Error("ArgumentOutOfRangeException:" + ex.ToString());
}
catch (SocketException ex)
{
logg.Error("SocketException:" + ex.ToString());
}
catch (ObjectDisposedException ex)
{
logg.Error("ObjectDisposedException:" + ex.ToString());
}
catch (SecurityException ex)
{
logg.Error("SecurityException:" + ex.ToString());
}
}
//TODO:将读取的字节转换成字符串
c.Shutdown(SocketShutdown.Both);
c.Close();



JAVA服务端代码:

try {
logger.info("建立新的连接:[ " + socket.getRemoteSocketAddress() + "]...");
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
String msg = null;
while ((msg = br.readLine()) != null) {

logger.info("客户端"+socket.getRemoteSocketAddress()+"请求通讯开始...");
logger.debug("请求:"+msg);
String msgrtn = new SocketMsgProvider(msg).dealMsg().toString();
logger.debug("请求返回:"+msgrtn);
logger.info("客户端"+socket.getRemoteSocketAddress()+"请求处理完成!");

pw.println(msgrtn);
}
br.close();
pw.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) socket.close();
} catch (IOException e) {
e.printStackTrace();
}
logger.info("连接:[ " + socket.getRemoteSocketAddress() +"]关闭成功,线程退出!");

}

private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}



由于数据量较大采用的是同步的方式,现在问题来了,某些客户端会出现调用SOCKET进行数据下载时接收了一部分数据就一直停在receive方法中(已经接收到了一部分),但是出现问题之后同样的东西换一台机器可能又是好的,就是在那台机器上不行,问题已经困扰了很久,因为是生产环境比较急。
想请教一下各位,C# socket在阻塞的时候能不能捕获到,或者有没有其它的方式能解决此问题,不胜感激。
...全文
215 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
请叫我卷福 2013-06-20
  • 打赏
  • 举报
回复
1.同步和异步只是编程中的思路 异步照样可以解决类似“不获取不登录”这样的业务逻辑问题 2.自己规定消息协议 规定数据包格式 比如 类型+长度+附加码+数据+其他 3.数据接收方定义缓冲区 将Receive到的数据写入缓冲区 再从缓冲区中判断是否有完整的消息包
YAOHE 2013-06-20
  • 打赏
  • 举报
回复
引用 5 楼 winco304 的回复:
[quote=引用 3 楼 YAOHE 的回复:] 先确定有接收到多少数据内容,再取数据。 c.Available 获取已经从网络接收且可供读取的数据量。 而不是固定去取多少数据。 取到定义大小的数据包后,再解包。
那是不是要改变报文格式了 把数据长度加到报文初使? 因为事先不知道要接收多少的; 另外,是在取包的过程中(已经取了一部分后)停在receive中的[/quote] 就是需要这样做。
winco304 2013-06-09
  • 打赏
  • 举报
回复
有大师来给个回复 谢谢!!!
ishengxun 2013-06-09
  • 打赏
  • 举报
回复
java做socket本来就很坑
winco304 2013-06-09
  • 打赏
  • 举报
回复
引用 3 楼 YAOHE 的回复:
先确定有接收到多少数据内容,再取数据。 c.Available 获取已经从网络接收且可供读取的数据量。 而不是固定去取多少数据。 取到定义大小的数据包后,再解包。
那是不是要改变报文格式了 把数据长度加到报文初使? 因为事先不知道要接收多少的; 另外,是在取包的过程中(已经取了一部分后)停在receive中的
winco304 2013-06-09
  • 打赏
  • 举报
回复
引用 2 楼 owennol 的回复:
数据量大还用同步啊,用异步接收啊,你都用BeginConnect了。。。。
在业务上要求是要用同步的 不获取不登录
YAOHE 2013-06-09
  • 打赏
  • 举报
回复
先确定有接收到多少数据内容,再取数据。 c.Available 获取已经从网络接收且可供读取的数据量。 而不是固定去取多少数据。 取到定义大小的数据包后,再解包。
owennol 2013-06-09
  • 打赏
  • 举报
回复
数据量大还用同步啊,用异步接收啊,你都用BeginConnect了。。。。

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧