下载

Client

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; //导入的命名空间
using System.Net.Sockets; namespace SocketClient
{
class Program
{
/// <summary>
/// Socket Server 演示
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//创建一个Socket
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //连接到指定服务器的指定端口
//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.connect.aspx
socket.Connect("localhost", ); Console.WriteLine("connect to the server");
//实现接受消息的方法 //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginreceive.aspx
socket.BeginReceive(buffer, , buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket); //接受用户输入,将消息发送给服务器端
while(true)
{
var message = "Message from client : " + Console.ReadLine();
var outputBuffer = Encoding.Unicode.GetBytes(message);
socket.BeginSend(outputBuffer, , outputBuffer.Length, SocketFlags.None, null, null);
} } static byte[] buffer = new byte[]; public static void ReceiveMessage(IAsyncResult ar)
{
try
{
var socket = ar.AsyncState as Socket; //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
var length = socket.EndReceive(ar);
//读取出来消息内容
var message = Encoding.Unicode.GetString(buffer, , length);
//显示消息
Console.WriteLine(message); //接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)
socket.BeginReceive(buffer, , buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}

Server

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; //额外导入的两个命名空间
using System.Net.Sockets;
using System.Net; namespace SocketServer
{
class Program
{
/// <summary>
/// Socket Server 演示
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //将该socket绑定到主机上面的某个端口
//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx
socket.Bind(new IPEndPoint(IPAddress.Any, )); //启动监听,并且设置一个最大的队列长度
//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx
socket.Listen(); //开始接受客户端连接请求
//方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket); Console.WriteLine("Server is ready!");
Console.Read();
} public static void ClientAccepted(IAsyncResult ar)
{ var socket = ar.AsyncState as Socket; //这就是客户端的Socket实例,我们后续可以将其保存起来
var client = socket.EndAccept(ar); //给客户端发送一个欢迎消息
client.Send(Encoding.Unicode.GetBytes("Hi there, I accept you request at " + DateTime.Now.ToString())); //实现每隔两秒钟给服务器发一个消息
//这里我们使用了一个定时器
var timer = new System.Timers.Timer();
timer.Interval = 2000D;
timer.Enabled = true;
timer.Elapsed += (o, a) =>
{
//检测客户端Socket的状态
if(client.Connected)
{
try
{
client.Send(Encoding.Unicode.GetBytes("Message from server at " + DateTime.Now.ToString()));
}
catch(SocketException ex)
{
Console.WriteLine(ex.Message);
}
}
else
{
timer.Stop();
timer.Enabled = false;
Console.WriteLine("Client is disconnected, the timer is stop.");
}
};
timer.Start(); //接收客户端的消息(这个和在客户端实现的方式是一样的)
client.BeginReceive(buffer, , buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client); //准备接受下一个客户端请求
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
} static byte[] buffer = new byte[]; public static void ReceiveMessage(IAsyncResult ar)
{ try
{
var socket = ar.AsyncState as Socket; //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx
var length = socket.EndReceive(ar);
//读取出来消息内容
var message = Encoding.Unicode.GetString(buffer, , length);
//显示消息
Console.WriteLine(message); //接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)
socket.BeginReceive(buffer, , buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
catch(Exception ex){
Console.WriteLine(ex.Message);
}
}
}
}

最新文章

  1. Java基础知识笔记(七:接口、变量作用域和参数传递)
  2. C#中的using和yield return混合使用
  3. HTML设置超链接字体颜色和点击后的字体颜色
  4. python数字图像处理(7):图像的形变与缩放
  5. stdcall与cdecl的区别
  6. Goal driven performance optimization
  7. Tomcat的8009端口AJP的利用
  8. post 方式提交XML文件调用接口
  9. iframe整理学习笔记
  10. 1008. Image Encoding(bfs)
  11. android之interpolator的用法详解
  12. 解决SVG跨浏览器兼容性问题
  13. Openjudge-计算概论(A)-1的个数
  14. base库
  15. 公司搬家,拿了个费机器,没root密码,又忘了怎么搞了,
  16. python元类理解2
  17. CUDA command Profiler
  18. Supervisor (进程管理利器) 使用说明 - 运维笔记
  19. 【转】SQLyog SSH 密钥登陆认证提示: No supported authentication methods available 解决方法
  20. iOS.UITableView.SectionIndex

热门文章

  1. day2-1流程控制语句及对象
  2. PPT页面切换动画
  3. 玩转NB-IOT模块之sim7000c
  4. Atom 必装插件
  5. SpringMvc 返回json的三种方式
  6. Linux CentOS7 rsync通过服务同步、linux系统日志、screen工具
  7. centos7一步一步搭建docker phpmyadmin 及nginx配置phpmyadmin非根目录重点讲解
  8. ch3 盒模型、定位
  9. Lesson 8 Trading standards
  10. Python字符串(二)