【.Net】Socket小示例
引言
项目中用到了Socket,这里做个控制台小示例记录一下。
Client
客户端的Receive用了异步方法,保持长连接,可以随时发送消息和响应服务端的消息,如下
static string ClientReceiveMessage = "";
static byte[] receivedBytes = new byte[];
static void Main(string[] args)
{ IPHostEntry ipHost = Dns.Resolve("127.0.0.1");
IPAddress ipAddress = ipHost.AddressList[];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, ); string sendingMessage = "Hello World Socket Test"; Console.WriteLine("Creating message: Hello World Socket Test"); Socket sender = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sender.Connect(ipEndPoint); sender.BeginReceive(receivedBytes, , receivedBytes.Length, , ReceiveCallback, sender); while (true)
{
sendingMessage = Console.ReadLine();
byte[] forwardMessage = Encoding.ASCII.GetBytes(sendingMessage + "[FINAL]");
sender.Send(forwardMessage);
}
} private static void ReceiveCallback(IAsyncResult ar)
{
Socket client = (Socket)ar.AsyncState; int totalBytesReceived = client.EndReceive(ar); if (totalBytesReceived > )
{ ClientReceiveMessage += Encoding.ASCII.GetString(receivedBytes, , totalBytesReceived);
if (ClientReceiveMessage.IndexOf("[FINAL]", StringComparison.Ordinal) > -)
{
Console.WriteLine(ClientReceiveMessage);
ClientReceiveMessage = "";
} client.BeginReceive(receivedBytes, , receivedBytes.Length, , new AsyncCallback(ReceiveCallback), client);
}
else
{
Console.WriteLine("服务端结束不再发送消息!" );
ClientReceiveMessage = "";
} }
Server
服务端循环异步Accept,可以接收多个client消息,并且马上回复。
static ManualResetEvent allDone = new ManualResetEvent(false);
static void Main(string[] args)
{ Socket listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
listener.Bind(new IPEndPoint(IPAddress.Any, ));
listener.Listen(); while (true)
{
allDone.Reset();
listener.BeginAccept(ar =>
{
allDone.Set(); Socket MyServer = (Socket)ar.AsyncState; Socket service = MyServer.EndAccept(ar); byte[] receivedBytes = new byte[]; while (true)
{
string receivedValue = string.Empty;
int numBytes = service.Receive(receivedBytes);
receivedValue += Encoding.ASCII.GetString(receivedBytes,, numBytes); if (receivedValue.IndexOf("[FINAL]", StringComparison.Ordinal) > -)
{
Console.WriteLine("Received value: {0} from " + service.RemoteEndPoint, receivedValue);
string replyValue = "Message successfully received.[FINAL]";
byte[] replyMessage = Encoding.ASCII.GetBytes(replyValue);
service.Send(replyMessage);
}
}
}, listener); allDone.WaitOne();
}
注意事项
1.Socket的Receive方法响应次数,是以缓冲数组的大小划分。如果数组大小为1024,消息为2048,Receive将会触发两次。作为接收方无法通过Receive来确定是否已完整接收,所以要对消息另作处理,例如在消息中增加[FINAL]来确定消息已发送完毕。
2.如果没有消息发送,接收方Receive方法会一直等待。但如果发送方调用Shutdown(SocketShutdown.Send)方法,接收方的Receive会马上返回0,所以在非来回传递消息的情况下,可以Shutdown方法来实现消息发送完毕。
3.可以设置ReceiveTimeout的值,超时会抛出异常,然而只能作用于Receive方法,对BeginReceive无效。
【.Net】Socket小示例的更多相关文章
- ReactNative新手学习之路06滚动更新ListView数据的小示例
本节带领大家学习使用ListView 做一个常用的滚动更新数据示例: 知识点: initialListSize={200} 第一次加载多少数据行 onEndReached={this.onEndRea ...
- MVC客户端验证的小示例
MVC客户端验证的小示例 配置客户端验证的可用性: <configuration> <appSettings> <add key="ClientValidat ...
- 多线程Java Socket编程示例
package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...
- CentOS7 安装 RocketMQ 实践和小示例
CentOS7 安装 RocketMQ 实践和小示例 1.通过 SSH 工具(比如 XShell)连接到 CentOS7 服务器上: 2.进入到 /usr/local 目录中: cd /usr/loc ...
- Socket 编程示例(二)
利用晚上这点闲暇时间,写了一个Socket通信的小实例,该实例包含服务器端和客户端.其基本工作流程是:当服务器启动服务以后,客户端进行连接,如果连接成功,则用户可以在发送消息框中输入待发送的消息,然后 ...
- java nio socket使用示例
这个示例,实现一个简单的C/S,客户端向服务器端发送消息,服务器将收到的消息打印到控制台,并将该消息返回给客户端,客户端再打印到控制台.现实的应用中需要定义发送数据使用的协议,以帮助服务器解析消息.本 ...
- Highcharts入门小示例
一.创建条形图 1.创建div容器 <div id="container" style="min-width:800px;height:400px"> ...
- Http与Socket小谈
http与socket是网络编程中最为重要的概念,不管是客户端还是服务端,都是最为重要的部分,以下简述两者的关系和区别(个人见解). Http 定义 基于应用层的超文本传输协议.通常承载于TCP/IP ...
- 多线程Java Socket编程示例(转)
这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送 ...
随机推荐
- 初识Locust---认识
性 能测试工具: 基于Python的性能测试工具-locust 现在性能测试方面有很多测试工具,比如我们熟悉的loadrunner.jmeter.ab等,用过的也就是这几种,如果是学过这些工具的可能对 ...
- golang strings.Split的疑问
先看下面的代码 func main() { fmt.Println("Hello, 世界") cc:=[...]int{} b:="" a:=strings.S ...
- go——工程结构
Go是一门推崇软件工程理念的编程语言,它为开发周期的每个环节都提供了完备的工具和支持. Go语言高度强调代码和项目的规范和统一,这几种体现在工程结构或者说代码体制的细节之处. 1.工作区 一般情况下, ...
- delphi编程创建桌面快捷方式
delphi编程创建桌面快捷方式 uses ActiveX,ComObj,StdCtrls,ShlObj,FileCtrl; procedure TForm1.N2Click(Sender: TO ...
- 12 Spring框架 SpringDAO的事务管理
上一节我们说过Spring对DAO的两个支持分为两个知识点,一个是jdbc模板,另一个是事务管理. 事务是数据库中的概念,但是在一般情况下我们需要将事务提到业务层次,这样能够使得业务具有事务的特性,来 ...
- 如何优雅地使用 Stack Overflow
链接:https://www.zhihu.com/question/20824615/answer/69560657 来源:转载 一,提问前一定要搜索,先在 Google 搜索,然后在 StackOv ...
- Github 的其他用法
一.概述 Github 除了作为代码托管库外,有趣的程序员们还利用它解锁了有趣的新姿势. 二.新姿势 2.1 Github Pages 可以为项目建立静态主页(即gh-pages分支), 也可以建立命 ...
- HYSBZ - 2243 染色 (树链剖分+线段树)
题意:树上每个结点有自己的颜色,支持两种操作:1.将u到v路径上的点颜色修改为c; 2.求u到v路径上有多少段不同的颜色. 分析:树剖之后用线段树维护区间颜色段数.区间查询区间修改.线段树结点中维护的 ...
- Maven实战--- dependencies与dependencyManagement的区别
在上一个项目中遇到一些jar包冲突的问题,之后还有很多人分不清楚dependencies与dependencyManagement的区别,本篇文章将这些区别总结下来. 1.DepencyManagem ...
- alias指令别名和 sshpass命令简化ssh登陆
在之前的一篇博文中 ubuntu下关于profile和bashrc中环境变量的理解 提到过可以编辑bashrc文件,vim ~/.bashrc,来编写自己的小指令,就是给长指令取个简单的别名.比如b ...