日期:2014-05-17  浏览次数:20831 次

Socket相关请教两个问题
背景:现在做的小项目是后台用java做服务端,c#做客户端,使用Socket进行通信,传递的都是基本的二进制流。

现有两个问题:
1.

 Byte[] outBuffer = new Byte[10240];
            Byte[] inBuffer = new Byte[10240];
            //发送消息 
            outBuffer = Encoding.Default.GetBytes(send + "\r");
            clientSocket.Send(outBuffer, outBuffer.Length, SocketFlags.None);
            clientSocket.Receive(inBuffer, 10240, SocketFlags.None);

c#想向java端发送二进制大致就是上面的模式,接收也是。
因为我对c#不熟,上面的字节数组都是初始写死大小的。
如果这时候服务端发来的数据大于字节数组的情况就不知道怎么处理了,同理发送数据的时候也一样,请问有什么好的方法吗。。之前有试过其他传递流的方式,但是在java端接收会有问题,好像只有这种二进制流的方式可以。

2:如何保证java端和C#端socket的长连接。
现在的代码没做任何处理,如果java端socket停止了,c#端就直接程序报错退出了。
目前想到的是捕获异常,然后重新连接。但是重新连接有可能继续连接失败。
重新连接的代码放在while循环里面,如果程序连不上就会卡死。
如果重新连接的代码放在定时器里面的话,由于客户端的大部分操作基本都是需要和socket通信的,那么程序基本也是不可用的。  
请问有什么方法可以保证长连接的问题,不仅仅是c#端,java端也是。


谢谢大家了哈

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

------解决方案--------------------
引用:
Quote: 引用:

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

如果在socket还在连接的过程中,用户点击了需要socket通信的按钮,这时要怎么办?
再建个线程,用多线程解决
------解决方案--------------------
1.1 发送数据最少需要 长度+数据,除非你的数据长度固定。
1.2 接收数据不能保证一次能完成,需要循环。

2.1 C#里面可以设置.xxxTimeOut防止超时。
2.2 try catch可以防止程序出错退出。
2.3 java端停止了,那么由此造成服务瞬间不可用是正常的。
如果客户端比较少,可以在客户端也启动控制服务;服务器端退出之前保存客户端列表到硬盘,服务器端重新加载的时候主动通知客户端。不过这样做比较麻烦。
------解决方案--------------------
1.双方通信的时候总有一个协议吧,提前预估缓存(如果非要局部new缓冲区的话),new小了就收不完了。发送到好处理,发多少你自己肯定知道。
2.
保持长连接,我个人认为重点是服务器,只有服务器不挂你才有继续TCP的意义,所以服务器端一定要处理好各种客户端的异常断开情况,保证服务器的稳定后客户端重连就相对容易些:假若服务器好着呢,你任何操作都可设置个超时事件么,如发送超时那肯定是你自己断了么,就主动去连接server,但最主要是的是你java server不敢挂啊