服务端(异步)

using System.Net ;

using System.Net.Sockets ;

using System.IO ;

using System.Text ;

using System.Threading ;

public static ManualResetEvent allDone = new ManualResetEvent(false);

private Thread th;

private bool listenerRun = true ;

Socket listener;

private const int MAX_SOCKET=10;

protected override void Dispose( bool disposing )

{

try

{

listenerRun = false ;

th.Abort ( ) ;

th = null ;

listener.Close();

}

catch { }

}

//得到本机IP地址

//得到本机IP地址

public static IPAddress GetServerIP()

{

IPHostEntry ieh=Dns.GetHostByName(Dns.GetHostName());

return ieh.AddressList[0];

}

//侦听方法

private void Listen()

{

try

{

int nPort=int.Parse(this.txtLocalPort.Text);

IPAddress ServerIp=GetServerIP();

IPEndPoint iep=new IPEndPoint(ServerIp,nPort);

listener=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

listener.Bind(iep);

listener.Listen(10);

statusBar1.Panels[0].Text ="端口:"+this.txtLocalPort.Text+"正在监听......";

while(listenerRun)

{

allDone.Reset();

listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);

allDone.WaitOne();

}

}

catch (System.Security.SecurityException )

{

MessageBox.Show ("防火墙安全错误!","错误",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);

}

}

//异步回调函数

public void AcceptCallback(IAsyncResult ar)

{

Socket listener = (Socket)ar.AsyncState;

Socket client=listener.EndAccept(ar) ;

allDone.Set();

StateObject state = new StateObject();

state.workSocket = client;

//远端信息

EndPoint tempRemoteEP = client.RemoteEndPoint;

IPEndPoint tempRemoteIP = ( IPEndPoint )tempRemoteEP ;

string rempip=tempRemoteIP.Address.ToString();

string remoport=tempRemoteIP.Port.ToString();

IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address ) ;

string HostName = host.HostName;

statusBar1.Panels[1].Text ="接受["+HostName+"] "+rempip+":"+remoport+"远程计算机正确连接!" ;

this.listboxRemohost.Items.Add("["+HostName+"] "+rempip+":"+remoport);

client.BeginReceive( state.buffer,0, StateObject.BufferSize, 0,

new AsyncCallback(readCallback), state);

}

//异步接收回调函数

public void readCallback(IAsyncResult ar)

{

StateObject state = (StateObject) ar.AsyncState;

Socket handler = state.workSocket;

int bytesRead = handler.EndReceive(ar);

if (bytesRead > 0)

{

string strmsg=Encoding.ASCII.GetString(state.buffer,0,bytesRead);

state.sb.Append(strmsg);

string content = state.sb.ToString();

//远端信息

EndPoint tempRemoteEP = handler.RemoteEndPoint;

IPEndPoint tempRemoteIP = ( IPEndPoint )tempRemoteEP ;

string rempip=tempRemoteIP.Address.ToString();

string remoport=tempRemoteIP.Port.ToString();

IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address ) ;

string HostName = host.HostName;

statusBar1.Panels[1].Text ="正在接收["+HostName+"] "+rempip+":"+remoport+"的信息..." ;

string time = DateTime.Now.ToString ();

listboxRecv.Items.Add("("+time+") "+HostName+":");

listboxRecv.Items.Add(strmsg) ;

if(content.IndexOf("\x99\x99")> -1)

{

statusBar1.Panels[1].Text ="信息接收完毕!" ;

//

//接收到完整的信息

//                     MessageBox.Show("接收到:"+content);

string msg=poweryd.CodeParse(content);

Send(handler,msg);//异步发送

//                     Send(content);//用单独的socket发送

}

else

{

handler.BeginReceive(state.buffer,0,StateObject.BufferSize, 0,

new AsyncCallback(readCallback), state);

}

}

}

//异步发送

private void Send(Socket handler, String data)

{

byte[] byteData = Encoding.ASCII.GetBytes(data);

handler.BeginSend(byteData, 0, byteData.Length, 0,

new AsyncCallback(SendCallback), handler);

//            handler.Send(byteData);

}

#region  //用单独的socket发送

private void Send(string data)

{

//            string ip=this.txtRemoIP.Text;

//            string port=this.txtRemoport.Text;

//            IPAddress serverIp=IPAddress.Parse(ip);

//            int serverPort=Convert.ToInt32(port);

//            IPEndPoint iep=new IPEndPoint(serverIp,serverPort);

//            Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

//            socket.Connect(iep);

//            byte[] byteMessage=Encoding.ASCII.GetBytes(data);

//            socket.Send(byteMessage);

//            socket.Shutdown(SocketShutdown.Both);

//            socket.Close();

}

#endregion

//异步发送回调函数

//异步发送回调函数

private static void SendCallback(IAsyncResult ar)

{

try

{

Socket handler = (Socket) ar.AsyncState;

int bytesSent = handler.EndSend(ar);

MessageBox.Show("发送成功!");

handler.Shutdown(SocketShutdown.Both);

handler.Close();

}

catch (Exception ex)

{

MessageBox.Show(ex.ToString());

}

}

private void btnListen_Click(object sender, System.EventArgs e)

{

th = new Thread (new ThreadStart(Listen));//以Listen过程来初始化线程实例

th.Start();//启动此线程

this.btnListen.Enabled=false;

}

private void btnClosenet_Click(object sender, System.EventArgs e)

{

try

{

listenerRun = false ;

th.Abort ( ) ;

th = null ;

listener.Close();

statusBar1.Panels[0].Text= "与客户端断开连接!";

statusBar1.Panels[1].Text= "";

}

catch

{

MessageBox.Show("连接尚未建立,断开无效!","警告");

}

}

private void btnExit_Click(object sender, System.EventArgs e)

{

try

{

listenerRun = false ;

th.Abort ( ) ;

th = null ;

listener.Close();

statusBar1.Panels[0].Text= "与客户端断开连接!";

statusBar1.Panels[1].Text= "";

}

catch(Exception ex)

{

MessageBox.Show(ex.Message);

}

finally

{

Application.Exit();

}

}

//异步传递的状态对象

public class StateObject

{

public Socket workSocket = null;

public const int BufferSize = 1024;

public byte[] buffer = new byte[BufferSize];

public StringBuilder sb = new StringBuilder();

}

客户端(同步发送并接收):

using System.Net ;

using System.Net.Sockets ;

using System.IO ;

using System.Text ;

using System.Threading ;

Socket socket;

int numbyte=1024;//一次接收到的字节数

private void btnConnect_Click(object sender, System.EventArgs e)

{

try

{

string ip=this.txtRemoIP.Text;

string port=this.txtRemoport.Text;

IPAddress serverIp=IPAddress.Parse(ip);

int serverPort=Convert.ToInt32(port);

IPEndPoint iep=new IPEndPoint(serverIp,serverPort);

IPHostEntry host = Dns.GetHostByAddress(iep.Address ) ;

string HostName = host.HostName;

socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

socket.Connect(iep);

IPEndPoint tempRemoteIP=( IPEndPoint )socket.LocalEndPoint;

statusBar1.Panels[0].Text ="端口:"+tempRemoteIP.Port.ToString()+"正在监听......";

statusBar1.Panels[1].Text ="与远程计算机["+HostName+"] "+ip+":"+port+"建立连接!" ;

}

catch

{

statusBar1.Panels[0].Text = "无法连接到目标计算机!";

}

#region

//            byteMessage=Encoding.ASCII.GetBytes(textBox1.Text+"99");

//            socket.Send(byteMessage);

//            byte[] bytes = new byte[1024];

//            socket.Receive(bytes);

//            string str=Encoding.Default.GetString(bytes);

//            MessageBox.Show("接收到:"+str);

//            socket.Shutdown(SocketShutdown.Both);

//            socket.Close();

#endregion

}

private void btnSend_Click(object sender, System.EventArgs e)

{

try

{

statusBar1.Panels[1].Text ="正在发送信息!" ;

string message=this.txtsend.Text;

SendInfo(message);

}

catch //异常处理

{

statusBar1.Panels[0].Text = "无法发送信息到目标计算机!";

}

}

private void SendInfo(string message)

{

#region

//            string ip=this.txtip.Text;

//            string port=this.txtport.Text;

//

//            IPAddress serverIp=IPAddress.Parse(ip);

//            int serverPort=Convert.ToInt32(port);

//            IPEndPoint iep=new IPEndPoint(serverIp,serverPort);

//            byte[] byteMessage;

//

//            socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

//            socket.Connect(iep);

#endregion

byte[] byteMessage=Encoding.ASCII.GetBytes(message+"\x99\x99");

socket.Send(byteMessage);

//远端信息

EndPoint tempRemoteEP = socket.RemoteEndPoint;

IPEndPoint tempRemoteIP = ( IPEndPoint )tempRemoteEP ;

string rempip=tempRemoteIP.Address.ToString();

string remoport=tempRemoteIP.Port.ToString();

IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address ) ;

string HostName = host.HostName;

//发送信息

string time1 = DateTime.Now.ToString();

listboxsend.Items.Add ("("+ time1 +") "+ HostName +":");

listboxsend.Items.Add (message ) ;

//发送完了,直接接收

StringBuilder sb = new StringBuilder();

while(true)

{

statusBar1.Panels[1].Text ="正在等待接收信息..." ;

byte[] bytes = new byte[numbyte];

int recvbytes=socket.Receive(bytes);

string strmsg=Encoding.Default.GetString(bytes);

string time2 = DateTime.Now.ToString();

listboxRecv.Items.Add("("+time2+") "+HostName+":");

listboxRecv.Items.Add (strmsg) ;

sb.Append(strmsg);

if(sb.ToString().IndexOf("\x99\x99")>-1)

{

break;

}

}

statusBar1.Panels[1].Text ="接收信息完毕!" ;

//

//代码解码

CodeParse(sb.ToString());

//

socket.Shutdown(SocketShutdown.Both);

socket.Close();

}

http://www.cnblogs.com/saptechnique/archive/2011/12/21/2295862.html

异步Socket通信总结[转]相关推荐

  1. JAVA基础知识之网络编程——-基于AIO的异步Socket通信

    异步IO 下面摘子李刚的<疯狂JAVA讲义> 按照POSIX标准来划分IO,分为同步IO和异步IO.对于IO操作分为两步,1)程序发出IO请求. 2)完成实际的IO操作. 阻塞IO和非阻塞 ...

  2. java aio socket_java核心学习(三十三) 网络编程---AIO实现异步Socket通信

    AIO需要操作系统的支持,在linux内核2.6版本中加入了对真正异步IO的支持,java从jdk1.7开始支持AIO 核心类有AsynchronousSocketChannel .Asynchron ...

  3. python异步socket接收_Python简易聊天工具-基于异步Socket通信

    #-*- coding: UTF-8 -*- from asyncore import dispatcher from asynchat import async_chat import asynco ...

  4. C#和Python的Socket通信

    目录 1.项目说明 2.Socket通信 2.1C#实现socket通信 2.2python实现socket通信 3.结果 3.1C#socket通信结果 3.2python和C# socket通信结 ...

  5. C# Socket系列三 socket通信的封包和拆包

    通过系列二 我们已经实现了socket的简单通信 接下来我们测试一下,在时间应用的场景下,我们会快速且大量的传输数据的情况! 1 class Program 2 { 3 static void Mai ...

  6. .net平台下C#socket通信(上)

    .net平台下C#socket通信(上) 完全是基础,新手可以随意看看,大牛可以关闭浏览页了,哈哈. 在开始介绍socket前先补充补充基础知识,在此基础上理解网络通信才会顺理成章,当然有基础的可以跳 ...

  7. Socket通信总结(附C++实现)

    Socket通信总结(附C++实现) 2012年08月16日 ⁄ C++⁄ 共 5870字 ⁄ 评论数 1 ⁄ 被围观 10,061+ 分享到: 文章目录 [隐藏] 一.Socket是什么 二.一些基 ...

  8. android的NDK和java进行本地socket通信

    关于Android应用与Framework的socket通信,相信关心这个问题的朋友们已经看过<android使用socket使底层和framework通信>这篇文章,美中不足的是作者只贴 ...

  9. connect: 网络不可达_Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制

    本文转自:https://github.com/jasonGeng88/blog 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

最新文章

  1. 谷歌人为干预搜索结果被曝光:增加大公司曝光,主动营造岁月静好
  2. Linux网络环境配置
  3. JUnit 测试含有控制台输入的方法
  4. jQuery.validate.js API
  5. (Head First 设计模式)学习笔记(1)
  6. C++实现另一个猜数字游戏
  7. 「leetcode」257. 二叉树的所有路径(详解)
  8. 【Python-numpy】输出array时array中间是省略号而没有输出全部内容
  9. 拓端tecdat|R语言中绘制箱形图的替代品:蜂群图和小提琴图
  10. 京东助手+淘宝试用助手+苏宁试用助手软件
  11. 虚拟偶像养成记:人工智能人格化与IP化打造出完美“爱豆”
  12. com.android.packageinstaller,Android PackageInstaller 安装和卸载
  13. ERROR: HHH000388: Unsuccessful: create table
  14. windows许可证即将过期 win10的解决办法
  15. WIN11添加我的电脑图标等的方法
  16. 李宏毅机器学习之RNN
  17. VS code 安装Source Code Pro字体
  18. nancy中的身份验证
  19. CKEditor和CKFinder及CKEditor配置属性说明
  20. html图片合成视频,将视频和图片合成到一个页面

热门文章

  1. android 导入离线地图,Android, 离线地图-2
  2. java 采集rtsp_通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口步骤概览
  3. 神策用户画像 2 大功能:千人千面,一人千面,一次给你
  4. 周四话分析:数据驱动,如何塑造下一个“教育领头羊”?
  5. zookeeper(一):功能和原理
  6. 微软发布 Microsoft SoftGrid 4.1 SP1 及 4.2 累计更新补丁
  7. C语言实现小时候经常做的智力测试题
  8. oracle时间用法
  9. SQL Server中利用存储过程来高性能地进行分页
  10. it is important to delete your email mailbox in a frequent manner!