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 异步 发送 接收 数据的更多相关文章

  1. 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制

    安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制 socket 连接采用流的方式进行发送接收数据,采用thread线程的方式. 什么是线程?  详细代码介 ...

  2. Socket异步发送的同步控制

    在网络通信中,我们使用Socket异步发送数据,但在客户端,往往是需要等待服务器的返回结果后(握手过程)再往下执行,这就涉及到同步控制了,在多次的实现中,使用AutoResetEvent,实现不,即有 ...

  3. 网络编程--使用UDP发送接收数据

    package com.zhangxueliang.udp; import java.io.IOException; import java.net.DatagramPacket; import ja ...

  4. 网络编程--使用TCP协议发送接收数据

    package com.zhangxueliang.tcp; import java.io.IOException; import java.io.OutputStream; import java. ...

  5. C# Socket模拟发送接收

    Socket简介 通过TCP/IP与仪器或设备通讯,在C#语言中,我们通常采用Socket.本项目是一个简单的Socket建立服务监听与Socket作为客户端请求的一个示例. 项目结构 客户端项目 S ...

  6. 从缓冲上看阻塞与非阻塞socket在发送接收上的区别

    最近在网络上看到一些帖子以及回复,同时又搜索了一些网络上关于阻塞非阻塞区别的描述,发现很多人在描述两者的发送接收时操作返回以及缓冲区处理的区别时有不同程度的误解.所以我想写一篇文章来纠正错误,并作为记 ...

  7. c# 串口发送接收数据

    /********************** 串口数据接收事件 *****************************/ private void SerialPort_DataReceived ...

  8. Http批量异步发送和数据保存

    先说需求. 有个服务程序定时扫描指定文件夹下一个所有文件,文件包含了多个用户(客户)信息及对应的http发送地址和发送数据.现在该服务程序需要提取这些用户信息,然后批量进行发送:发送完后需要将http ...

  9. linux系统中使用socket直接发送ARP数据

    这个重点是如这样创建socket:  sock_send = socket ( PF_PACKET , SOCK_PACKET , htons ( ETH_P_ARP) ) ; 其后所有收发的数据都是 ...

随机推荐

  1. (4.16)mysql备份还原——物理备份之XtraBackup实践

    关键词:XtraBackup实践,物理备份,xtrabackup备份,innobackupex备份 [1]如何使用? [3]系列:innobackupex --help |more [4]系列:xtr ...

  2. tourist's modular arithmetic class

    #include <bits/stdc++.h> using namespace std; template <typename T> T inverse(T a, T m) ...

  3. Linux运维必备工具

    1. 查看进程占用带宽情况 - Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽. 前提条件:安装c++环境 yum install -y gcc-c++ ...

  4. jQuery扁平化风格手风琴菜单

    在线演示 本地下载

  5. Win32汇编-创建窗体代码

    1.一个最简单的窗体的创建 ;>>>>>>>>>>>>>>>>>>>>>& ...

  6. [Next] 三.next自定义服务器和路由

    next 服务端渲染 实际上,next 一直都是执行的服务端渲染.npm start执行的是 next 自带的服务器来运行你的应用.next 是支持自定义服务器的,同时能够支持现有的路由和模式,你可以 ...

  7. javascript--获取一个页面各个标签的数量

    获取一个页面各个标签的数量 document.getElementsByTagName('*')--获取所有的标签. var obj = document.getElementsByTagName(' ...

  8. vue-resource 全局拦截器

    项目中可能会添加超时登录的功能,因此根据tokenid 判断是否超时.如果token已过期,需要跳转至登录页面. 因此需要用到全局拦截器拦截返回的状态 //下边代码添加在main.js中 Vue.ht ...

  9. SQL SERVER 中 sp_rename 用法

    转自:http://www.cnblogs.com/no7dw/archive/2010/03/04/1678287.html 因需求变更要改表的列名,平常都是跑到Enterprise manager ...

  10. Linux分布式消息队列RocketMQ部署与监控--双Master

    环境准备:CentOS_6.5_x64 IP: 192.168.0.249 dbTest249  Master1 IP: 192.168.0.251 webTest251 Master2 下载 ali ...