socket 异步 发送 接收 数据
Socket socketClints = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //侦听socket
//socketClints.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
socketClints.Bind(new IPEndPoint(IPAddress.Any, portSocketInt)); socketClints.Listen();
socketClints.BeginAccept(new AsyncCallback(ClientAccepted), socketClints); //开始接收来自浏览器的http请求(其实是socket连接请求)
#region 客户端连接成功
byte[] buffer = new byte[];
/// <summary>
/// 客户端连接成功
/// </summary>
/// <param name="ar"></param>
public void ClientAccepted(IAsyncResult ar)
{
#region
var socket = ar.AsyncState as Socket;
//这就是客户端的Socket实例,我们后续可以将其保存起来
var client = socket.EndAccept(ar);
//接收客户端的消息(这个和在客户端实现的方式是一样的)异步
client.BeginReceive(buffer, , buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
//准备接受下一个客户端请求(异步)
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
#endregion
}
#endregion
#region 接收客户端的信息
/// <summary>
/// 接收某一个客户端的消息
/// </summary>
/// <param name="ar"></param>
public void ReceiveMessage(IAsyncResult ar)
{
int length = ;
var socket = ar.AsyncState as Socket;
//客户端IP地址和端口信息
try
{
#region
//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
length = socket.EndReceive(ar);
//读取出来消息内容
string recv_request = Encoding.UTF8.GetString(buffer, , length);
//输出接收信息
//WriteLine(clientipe + " :" + message, ConsoleColor.White);
//消息处理
socketResolve(recv_request, socket);
//服务器发送消息
//socket.Send(Encoding.UTF8.GetBytes("server received data")); //默认Unicode
//接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息)异步
socket.BeginReceive(buffer, , buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
#endregion
}
catch
{
//设置计数器
}
}
//发送方法 需要修改数据
public void sendData()
{
byte[] data=System.Text.Encoding.UTF8.GetBytes(Encrypt(txt,sKey));
byte[] byLen = BitConverter.GetBytes(data.Length);
socket.Send(byLen);
//socket.Send();
socket.Send(data);
}
#endregion
客户端:
ThStartBool=true;
newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
while (ThStartBool)
{
try
{
newSocket.Connect(ip, int.Parse(port)); socketSend("url/" + obj.ToString() + "_OK/");
Invoke(updateLableText, "连接成功"); //ReceiveObject state = new ReceiveObject() { Client = newSocket };
//newSocket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), state);
newSocket.BeginReceive(m_byLen, 0, m_byLen.Length, SocketFlags.None, new AsyncCallback(RecvLen), newSocket); ThStartBool = false;
}
catch (Exception)
{ Thread.Sleep();//3秒后重新连接
}
}
int m_nIndex = 0, m_nRecvLen = 0;
byte[] m_byLen = new byte[4];
byte[] m_byData = null; private void RecvLen(IAsyncResult ar)
{
try
{
Socket sock = ar.AsyncState as Socket;
int nLen = sock.EndReceive(ar); m_nRecvLen += nLen;
if (m_nRecvLen != m_byLen.Length)
{
m_nIndex += nLen;
sock.BeginReceive(m_byLen, m_nIndex, m_byLen.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvLen), sock);
}
else
{
m_nIndex = m_nRecvLen = 0;
m_byData = new byte[BitConverter.ToUInt32(m_byLen, 0)];
sock.BeginReceive(m_byData, m_nIndex, m_byData.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvData), sock); }
} catch (Exception ex)
{
Invoke(updateLableText, "与服务器失去联系,正在尝试重连");
ThStartBool = true;
th = new Thread(new ParameterizedThreadStart(ThStartData));
th.Start(signID);
}
} private void RecvData(IAsyncResult ar)
{
Socket sock = ar.AsyncState as Socket;
int nLen = sock.EndReceive(ar);
m_nRecvLen += nLen;
if (m_nRecvLen != m_byData.Length)
{
m_nIndex += nLen;
sock.BeginReceive(m_byData, m_nIndex, m_byData.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvData), sock);
}
else
{
m_nIndex = m_nRecvLen = 0;
//MessageBox.Show(Encoding.UTF8.GetString(m_byData));
string sKey = signID.Substring(2, 3) + signID.Substring(5, 3) + signID.Substring(10, 2);
//读取出来消息内容
var message = Encoding.UTF8.GetString(m_byData);
dataParsing(Decrypt(message.ToString(), sKey));
sock.BeginReceive(m_byLen, m_nIndex, m_byLen.Length - m_nIndex, SocketFlags.None, new AsyncCallback(RecvLen), sock);
}
}
socket 异步 发送 接收 数据的更多相关文章
- 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制
安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制 socket 连接采用流的方式进行发送接收数据,采用thread线程的方式. 什么是线程? 详细代码介 ...
- Socket异步发送的同步控制
在网络通信中,我们使用Socket异步发送数据,但在客户端,往往是需要等待服务器的返回结果后(握手过程)再往下执行,这就涉及到同步控制了,在多次的实现中,使用AutoResetEvent,实现不,即有 ...
- 网络编程--使用UDP发送接收数据
package com.zhangxueliang.udp; import java.io.IOException; import java.net.DatagramPacket; import ja ...
- 网络编程--使用TCP协议发送接收数据
package com.zhangxueliang.tcp; import java.io.IOException; import java.io.OutputStream; import java. ...
- C# Socket模拟发送接收
Socket简介 通过TCP/IP与仪器或设备通讯,在C#语言中,我们通常采用Socket.本项目是一个简单的Socket建立服务监听与Socket作为客户端请求的一个示例. 项目结构 客户端项目 S ...
- 从缓冲上看阻塞与非阻塞socket在发送接收上的区别
最近在网络上看到一些帖子以及回复,同时又搜索了一些网络上关于阻塞非阻塞区别的描述,发现很多人在描述两者的发送接收时操作返回以及缓冲区处理的区别时有不同程度的误解.所以我想写一篇文章来纠正错误,并作为记 ...
- c# 串口发送接收数据
/********************** 串口数据接收事件 *****************************/ private void SerialPort_DataReceived ...
- Http批量异步发送和数据保存
先说需求. 有个服务程序定时扫描指定文件夹下一个所有文件,文件包含了多个用户(客户)信息及对应的http发送地址和发送数据.现在该服务程序需要提取这些用户信息,然后批量进行发送:发送完后需要将http ...
- linux系统中使用socket直接发送ARP数据
这个重点是如这样创建socket: sock_send = socket ( PF_PACKET , SOCK_PACKET , htons ( ETH_P_ARP) ) ; 其后所有收发的数据都是 ...
随机推荐
- [c++] 计算太阳高度角
/* 输入参数: Longitude - 经度(单位"度") Latitude - 纬度(单位"度") Year - 年 Month - 月 Day - 日 H ...
- 自然语言处理工具hanlp 1.7.3版本更新内容一览
HanLP 1.7.3 发布了.HanLP 是由一系列模型与算法组成的 Java 工具包,目标是普及自然语言处理在生产环境中的应用.HanLP 具备功能完善.性能高效.架构清晰.语料时新.可自定义的特 ...
- sql sever 两数据表差异比较EXCEPT、INTERSECT
1.概念: EXCEPT主要是用来获取两个结果集的差:两个结果用EXCEPT链接,返回第一个结果集不在第二个结果集中的数据. INTERSECT主要是用来获取两个结果集的交集:两个结果用INTERSE ...
- std::tr1::function和bind组件
C++中std::tr1::function和bind 组件的使用 在C++的TR1中(Technology Report)中包含一个function模板类和bind模板函数,使用它们可以实现类似函数 ...
- 数据库or、in、<>、>=、<=、butween区别
操作前先关闭数据库缓存 #创建测试的test表 DROP TABLE IF EXISTS test; CREATE TABLE test( `id` ) NOT NULL, `name` ) DEFA ...
- GitHub从小白到熟悉<四>
GitHub issue 使用教程 创建 一个issue (显示所有bug 或者 说 交流的 问题列表)
- USB fuzzing
简介 最近看一些USB fuzzing方面的东西,总结一下.主要是软件方面的工作. vUSBf 文章在这里:https://www.blackhat.com/docs/eu-14/materials/ ...
- Codeforces 1229B. Kamil and Making a Stream
传送门 注意到只要考虑祖先和后代之间的贡献 发现对于一个节点,他和所有祖先最多产生 $log$ 个不同的 $gcd$ 所以每个节点开一个 $vector$ 维护祖先到自己所有不同的 $gcd$ 和这个 ...
- Codeforces Round #603 F Economic Difficulties
题目大意 给你两棵树,结点分别是1-A与1-B,然后给了N台设备,并且A树和B树的叶子结点(两棵树的叶子节点数量相同)都是链接电机的.问,最多可以删掉几条边使得每个设备都能连到任意一棵(或两棵)树的根 ...
- SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum avg() 函数 定义和用法 AVG 函数返回数值列的平均值.NULL ...