当前位置:编程学习 > C#/ASP.NET >>

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

场景是这样的:客户端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在阻塞的时候能不能捕获到,或者有没有其它的方式能解决此问题,不胜感激。
C# socket RECEIVE 阻塞 --------------------编程问答-------------------- 有大师来给个回复 谢谢!!! --------------------编程问答-------------------- 数据量大还用同步啊,用异步接收啊,你都用BeginConnect了。。。。 --------------------编程问答-------------------- 先确定有接收到多少数据内容,再取数据。
c.Available 获取已经从网络接收且可供读取的数据量。
而不是固定去取多少数据。
取到定义大小的数据包后,再解包。 --------------------编程问答--------------------
引用 2 楼 owennol 的回复:
数据量大还用同步啊,用异步接收啊,你都用BeginConnect了。。。。


在业务上要求是要用同步的 不获取不登录 --------------------编程问答--------------------
引用 3 楼 YAOHE 的回复:
先确定有接收到多少数据内容,再取数据。
c.Available 获取已经从网络接收且可供读取的数据量。
而不是固定去取多少数据。
取到定义大小的数据包后,再解包。


那是不是要改变报文格式了  把数据长度加到报文初使? 因为事先不知道要接收多少的;
另外,是在取包的过程中(已经取了一部分后)停在receive中的 --------------------编程问答-------------------- java做socket本来就很坑 --------------------编程问答--------------------
引用 5 楼 winco304 的回复:
Quote: 引用 3 楼 YAOHE 的回复:

先确定有接收到多少数据内容,再取数据。
c.Available 获取已经从网络接收且可供读取的数据量。
而不是固定去取多少数据。
取到定义大小的数据包后,再解包。


那是不是要改变报文格式了  把数据长度加到报文初使? 因为事先不知道要接收多少的;
另外,是在取包的过程中(已经取了一部分后)停在receive中的


就是需要这样做。 --------------------编程问答-------------------- 1.同步和异步只是编程中的思路  异步照样可以解决类似“不获取不登录”这样的业务逻辑问题

2.自己规定消息协议  规定数据包格式  比如 类型+长度+附加码+数据+其他

3.数据接收方定义缓冲区  将Receive到的数据写入缓冲区  再从缓冲区中判断是否有完整的消息包
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,