关于2,为防止程序出错并便于调试,可以将代码放在try中try
{
//功能代码
}
catch (Exception ex)
{
System.Windows.MessageBox.Show("错误原因:" + ex.ToString());
}
如果循环会卡死,可以新建一个线程,在线程里while,在while里加入while(true)
{
//功能代码
Thread.Sleep(100);//间隔0.1秒
}
{
//功能代码
}
catch (Exception ex)
{
System.Windows.MessageBox.Show("错误原因:" + ex.ToString());
}
如果循环会卡死,可以新建一个线程,在线程里while,在while里加入while(true)
{
//功能代码
Thread.Sleep(100);//间隔0.1秒
}
如果在socket还在连接的过程中,用户点击了需要socket通信的按钮,这时要怎么办?
1.2 接收数据不能保证一次能完成,需要循环。2.1 C#里面可以设置.xxxTimeOut防止超时。
2.2 try catch可以防止程序出错退出。
2.3 java端停止了,那么由此造成服务瞬间不可用是正常的。
如果客户端比较少,可以在客户端也启动控制服务;服务器端退出之前保存客户端列表到硬盘,服务器端重新加载的时候主动通知客户端。不过这样做比较麻烦。
2.
保持长连接,我个人认为重点是服务器,只有服务器不挂你才有继续TCP的意义,所以服务器端一定要处理好各种客户端的异常断开情况,保证服务器的稳定后客户端重连就相对容易些:假若服务器好着呢,你任何操作都可设置个超时事件么,如发送超时那肯定是你自己断了么,就主动去连接server,但最主要是的是你java server不敢挂啊
第一个问题我觉得你楼上的说的循环比较适合,因为接收的数据有查询某个表的结果,表的内容肯定随时间增加越来越多的。第二个问题请问下java端服务挂了有哪些常见的情况??比如停电??还有其他程序方面的的情况吗?
第一个问题我觉得你楼上的说的循环比较适合,因为接收的数据有查询某个表的结果,表的内容肯定随时间增加越来越多的。第二个问题请问下java端服务挂了有哪些常见的情况??比如停电??还有其他程序方面的的情况吗?
1.receive操作无论是利用while true还是递归都得一直运行哪,当然是循环接收,不然你咋一直通信呢,这和我说的不是一个意思。你没理解我意思,比如你刚开始receive的时候,总要传一个缓冲区进去吧,那传多大呢?你传10240进去是不,假如一次给你发了10241个呢?程序肯定是响应了2次receive(这里当然是在循环了),这种类似的粘包和截包是不好处理的,所以我说适当的根据协议规定好最大可能的数据包长度,假如协议里最长一帧为10240,那你就可以比这个稍稍大一点嘛。
2.参考
socket创建时发送接收都有个缓冲区大小吧,一次发送接收的数据最大就那么大。
Byte[] recvBytes = new Byte[user.socket.ReceiveBufferSize];
int length = 0; length = user.socket.Receive(recvBytes, recvBytes.Length, 0);length是实际的长度
但是我个人认为 长度+内容 是最简单方便通用的。即使对于未知长度的Stream,也可以采用分段传输的方法处理。