Socket通讯怎么把客户端的长连接改成短链接

xzl200712 2017-05-12 05:30:28
namespace ClientBySocket
{
public class SocketClientManager
{
public Socket _socket = null;
public EndPoint endPoint = null;
public SocketInfo socketInfo = null;
public bool _isConnected = false;

public delegate void OnConnectedHandler();
public event OnConnectedHandler OnConnected;
public event OnConnectedHandler OnFaildConnect;
public delegate void OnReceiveMsgHandler();
public event OnReceiveMsgHandler OnReceiveMsg;

public SocketClientManager(string ip, int port)
{
IPAddress _ip = IPAddress.Parse(ip);
endPoint = new IPEndPoint(_ip, port);
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//s2.Connect(ipendpoint);
}

public void Start()
{
_socket.BeginConnect(endPoint, ConnectedCallback, _socket);
_isConnected = true;
Thread socketClient = new Thread(SocketClientReceive);
socketClient.IsBackground = true;
socketClient.Start();
}

public void SocketClientReceive()
{
while (_isConnected)
{
SocketInfo info = new SocketInfo();
try {
_socket.BeginReceive(info.buffer, 0, info.buffer.Length, SocketFlags.None, ReceiveCallback, info);
}
catch (SocketException ex)
{
_isConnected = false;
}

Thread.Sleep(1000);
}
}

public void ReceiveCallback(IAsyncResult ar)
{
socketInfo = ar.AsyncState as SocketInfo;
if (this.OnReceiveMsg != null) OnReceiveMsg();
}
//链接服务器端
public void ConnectedCallback(IAsyncResult ar)
{
Socket socket = ar.AsyncState as Socket;
if (socket.Connected)
{
if (this.OnConnected != null) OnConnected();
}
else
{
if (this.OnFaildConnect != null) OnFaildConnect();
}
}

public void SendMsg(string msg)
{
//1
byte[] buffer = Encoding.Default.GetBytes(msg);
_socket.Send(buffer);
}

public class SocketInfo
{
public Socket socket = null;
public byte[] buffer = null;

public SocketInfo()
{
buffer = new byte[1024 * 4];
}
}
}
}

怎么把长链接改成短连接



...全文
364 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
所谓长连接,假设一段跟另一端保持长连接不断地收发消息而不出错,那么改为“短链接”其实拍拍屁股就知道怎么做,就是不要长连接,一旦“一问一答”之后就立刻 Close,下一个请求则再当成一次重连来看待,这就行了。 提这个问题其实就说明你没用实际学习搞明白走路的姿势,就研究芭蕾舞了。
  • 打赏
  • 举报
回复
你客户端发送消息->接收返回值,然后立刻 Close,这就是短链接。当每一次要发送消息时都单独创建一个独立的客户端连接,重新建立握手过程。 贴一大堆代码为什么?如果看不懂的话,那么最好找给你写这个代码的人来改代码。如果是你自己写的,那么按照上面设计模式,自己改改该改的代码就可以了。 实际上,假设你这段代码性能很差、资源占用很高、能支持的并发数很少很少,比别人的程序的性能差1万倍左右,那是因为你写了 Sleep(1000) 之类的代码。 完全看不懂,在 Start 方法中怎么会有一个 SocketClientReceive 呢?在 SocketClientReceive 方法中怎么会不管不顾地无限地创建冗余的 BeginReceive 任务呢?在 ReceiveCallback 方法中怎么会胡乱地给相对于当前线程而全局的 socketInfo 变量冲突地赋值呢? 而你的代码只有一丁点内容,剩下的重要的、大部分有点内涵的东西都被你用 OnReceiveMsg 这个概念名词儿给隐藏了,根本从你的代码中看不到是怎么设计消息解析操作过程的了。 也就是说你刚做了一丁点事情,又放弃、转向、玩儿别的“短链接”概念去了。

110,539

社区成员

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

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

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