关于2,为防止程序出错并便于调试,可以将代码放在try中try
{
    //功能代码
}
catch (Exception ex)
{
    System.Windows.MessageBox.Show("错误原因:" + ex.ToString());
}
如果循环会卡死,可以新建一个线程,在线程里while,在while里加入while(true)
{
    //功能代码
    Thread.Sleep(100);//间隔0.1秒
}

解决方案 »

  1.   


    如果在socket还在连接的过程中,用户点击了需要socket通信的按钮,这时要怎么办?
      

  2.   

    如果在socket还在连接的过程中,用户点击了需要socket通信的按钮,这时要怎么办?再建个线程,用多线程解决
      

  3.   

    1.1 发送数据最少需要 长度+数据,除非你的数据长度固定。
    1.2 接收数据不能保证一次能完成,需要循环。2.1 C#里面可以设置.xxxTimeOut防止超时。
    2.2 try catch可以防止程序出错退出。
    2.3 java端停止了,那么由此造成服务瞬间不可用是正常的。
    如果客户端比较少,可以在客户端也启动控制服务;服务器端退出之前保存客户端列表到硬盘,服务器端重新加载的时候主动通知客户端。不过这样做比较麻烦。
      

  4.   

    1.双方通信的时候总有一个协议吧,提前预估缓存(如果非要局部new缓冲区的话),new小了就收不完了。发送到好处理,发多少你自己肯定知道。
    2.
    保持长连接,我个人认为重点是服务器,只有服务器不挂你才有继续TCP的意义,所以服务器端一定要处理好各种客户端的异常断开情况,保证服务器的稳定后客户端重连就相对容易些:假若服务器好着呢,你任何操作都可设置个超时事件么,如发送超时那肯定是你自己断了么,就主动去连接server,但最主要是的是你java server不敢挂啊
      

  5.   


    第一个问题我觉得你楼上的说的循环比较适合,因为接收的数据有查询某个表的结果,表的内容肯定随时间增加越来越多的。第二个问题请问下java端服务挂了有哪些常见的情况??比如停电??还有其他程序方面的的情况吗?
      

  6.   


    第一个问题我觉得你楼上的说的循环比较适合,因为接收的数据有查询某个表的结果,表的内容肯定随时间增加越来越多的。第二个问题请问下java端服务挂了有哪些常见的情况??比如停电??还有其他程序方面的的情况吗?
    1.receive操作无论是利用while true还是递归都得一直运行哪,当然是循环接收,不然你咋一直通信呢,这和我说的不是一个意思。你没理解我意思,比如你刚开始receive的时候,总要传一个缓冲区进去吧,那传多大呢?你传10240进去是不,假如一次给你发了10241个呢?程序肯定是响应了2次receive(这里当然是在循环了),这种类似的粘包和截包是不好处理的,所以我说适当的根据协议规定好最大可能的数据包长度,假如协议里最长一帧为10240,那你就可以比这个稍稍大一点嘛。
    2.参考
      

  7.   

    receive接收使用beginreceive ,endreceive;,当然这个是一个线程,平时阻塞在beginreceive ,有数据传输过来就会调用endreceive接收数据。
    socket创建时发送接收都有个缓冲区大小吧,一次发送接收的数据最大就那么大。
      

  8.   

    接受长度以后不就知道需要new多大的数组了吗?
      

  9.   

    socket.ReceiveBufferSize是缓冲区大小
    Byte[] recvBytes = new Byte[user.socket.ReceiveBufferSize];
    int length = 0;     length = user.socket.Receive(recvBytes, recvBytes.Length, 0);length是实际的长度
      

  10.   

    晕死!不知道上学时你们的老师是否教过你几行代码、使用Stream进行文件拷贝。道理是一样的。比如说对方发来的消息是20000个字节,那么你的Buffer不论是设置为 200个字节还是200000000个字节,都要收到整个消息。什么叫做“先预估缓冲区大小?”实际上,就算是你的buffer只有一个字节,你也可以收到20000个字节的消息。请搞懂这个道理。
      

  11.   

    至于说所谓的“先传一个长度”,这是一种想当然。可以不可以传一个长度?当然可以。但是所有的Stream流操作都是前几个字节是长度?很少!着就好像你去面馆吃面条,你跟老板说“你要是不给我一个叉子挑着吃,我就不会吃面条。因为我看别人这样吃过一回“。显然,你看“别人的”出了偏差,你没有仔细看更多真正会吃面条的人如何吃面条。在你的例子中可以看到,代码outBuffer = Encoding.Default.GetBytes(send + "\r");因此我们就有理猜测,接收的消息可能也是以一个回车符为消息结束符。而根本不是想当然地弄什么“先传一个长度”。最后由此总结一下,你应该请教你的“后台”系统程序员。任何协同的编程,都要先搞懂你们自己的规范。而不要简单地在csdn上来找规范。
      

  12.   

    虽然自定义协议可以有很多种实现手段,把简单问题搞复杂的方法同样有很多种。
    但是我个人认为 长度+内容 是最简单方便通用的。即使对于未知长度的Stream,也可以采用分段传输的方法处理。