接下来是客户端部分,采用同步接收模式,在SocketClient项目中新建了一个SynServer类,用于存放socket服务器代码,和AsynServer类似,主要有4个方法:

有一个全局socket,下面四个方法中都用到。

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

类框架如下:

1.构造方法 public SynClient(IPEndPoint serverIp)

  传入一个终结点参数,连接服务器,代码如下:

 public SynClient(IPEndPoint serverIp)
{
Console.WriteLine("**连接服务器**");
socket.Connect(serverIp);
Console.WriteLine("**连接成功**");
SynSend("Client:Hello!Server.");
SyncReceive();
}

当服务器端开启监听服务(Accept()),后,客户端通过connect()方法连接服务器,serverIp是服务器的终结点地址,本机调试配置为127.0.0.1:port,在main()函数中配置。

2.同步发送函数  public int SynSend(string msg)

        public int SynSend(string msg)
{
Socket socket = this.socket;
byte[] data = Encoding.UTF8.GetBytes(msg);
try
{
int sendLength = socket.Send(data);
Console.WriteLine("SynSend {0} bytes to server:{1} successfully", sendLength,socket.RemoteEndPoint.ToString());
}
catch (SocketException e)
{
Console.WriteLine("发送失败:{0} \n Error code:{1}", e.Message, e.ErrorCode);
return e.ErrorCode;
}
return ; }

3.同步接收函数 public virtual void SyncReceive()

  public virtual void SyncReceive()
{
//StringBuilder sb = new StringBuilder(1024*1024);
Thread th = new Thread(() =>
{
while (receiveFlag)
{
byte[] buffer = new byte[];
int r = socket.Receive(buffer);
string receiveStr = Encoding.ASCII.GetString(buffer, , r);
Console.WriteLine(receiveStr);
//sb.AppendFormat("{0}", Encoding.ASCII.GetString(buffer, 0, r));
}
});
th.Start();
}

与异步不同,同步发送接收时系统不会像异步收发时自动开线程,所以SynSend()会阻碍主线程,因为只发送了一次,所以没有为它手动开线程,而SyncReceive()给它开了一个线程,线程中使用while循环一直接收,是程序在接收的过程中还可以处理其他业务。

4.释放资源函数  public void Close()

public void Close()
{
socket.Dispose();
socket.Close();
}

服务器和客户端类都写好后,我们来调试一下,在两个主函数中配置终结点,并调用服务类,截图如下:

服务器: 使用本机地址127.0.0.1端口8888

客户端:终结点地址和服务器开的监听地址一致

补充一下,第一篇中的框架截图中有错别字,在截一次------

最后测试一下结果,进入Debug目录,先打开SocketServer.exe,再打开SocketClient.exe,显示结果如下:

本次通信成功,客户端收到了服务器的消息,服务器也收到了客户端的消息。

前三篇中完成了最基本的通信,接下来文章将在此基础上增加通信控制,以及解决接收时的黏包问题。如果大家觉得博文中有什么不足的地方,欢迎指出,我在努力提高自己的技术是也会努力提高我的写作技巧和表达能力的:-)

Socket异步通信学习三的更多相关文章

  1. Socket异步通信学习一

    最近在做一个频谱管理项目,负责通信模块,自己也是小白,重头学起,直至今天通信基本框架已经完成,把自己在学习中的心得与大家分享一下,做一个socket系列的博文,顺便加固一下自己对socket通信的认识 ...

  2. Socket异步通信学习二

    接下来是服务器部分,采用异步模式,新建了一个AsynServer类,用于存放socket服务器代码,主要有4个方法: 有一个全局socket,下面四个方法中都用到. Socket socket = n ...

  3. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

  4. socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto

    socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...

  5. TCP协议和socket API 学习笔记

    本文转载至 http://blog.chinaunix.net/uid-16979052-id-3350958.html 分类:  原文地址:TCP协议和socket API 学习笔记 作者:gilb ...

  6. C#高性能大容量SOCKET并发(三):接收、发送

    原文:C#高性能大容量SOCKET并发(三):接收.发送 异步数据接收有可能收到的数据不是一个完整包,或者接收到的数据超过一个包的大小,因此我们需要把接收的数据进行缓存.异步发送我们也需要把每个发送的 ...

  7. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  8. TweenMax动画库学习(三)

    目录               TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)           ...

  9. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

随机推荐

  1. 在Linux运行期间升级Linux系统(Uboot+kernel+Rootfs)

    版本:v1.2   Crifan Li 摘要 本文主要介绍了如何在嵌入式Linux系统运行的时候,进行升级整个Linux系统,包括uboot,kernel和rootfs.以及简介Linux中的已有的通 ...

  2. 线性存储结构-Stack

    Stack继承于Vector,是一个模拟堆栈结构的集合类.当然也属于顺序存储结构.这里注意Android在com.android.layoutlib.bridge.impl包中也有一个Stack的实现 ...

  3. 浏览器的CSS Hacks

    LZ注:此文原作者是:Paul Irish(Google的前端开发工程师),本文是原文的部分译文. 我不再使用CSS Hacks了,相反的是,我将使用IE的条件判断将类应用到body标签.   但是, ...

  4. input子系统 KeyPad-Touch上报数据格式与机制

    -----------------------------------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://b ...

  5. oracle 启用归档日志

    Oracle可以运行在2种模式下:归档模式(archivelog)和非归档模式(noarchivelog) 归档模式可以提高Oracle数据库的可恢复性,生产数据库都应该运行在此模式下,归档模式应该和 ...

  6. bzoj 1412 [ZJOI2009]狼和羊的故事(最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1412 [题意] 在一个n*m的格子中,将羊和狼隔开的最小代价. [思路] 最小割. 由 ...

  7. NOIP2007 字符串展开

    .字符串的展开 (expand.pas/c/cpp) [问题描述] 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子 ...

  8. 中断——中断描述符表的定义和初始化(一) (基于3.16-rc4)

    1.中断描述符表的定义(arch/x86/kernel/traps.c) gate_desc debug_idt_table[NR_VECTORS] __page_aligned_bss; 定义的描述 ...

  9. 让你系统认识flume及安装和使用flume1.5传输数据到hadoop2.2

    本文链接: http://www.aboutyun.com/thread-7949-1-1.html 问题导读:1.什么是flume?2.如何安装flume?3.flume的配置文件与其它软件有什么不 ...

  10. Linq to Sql 总生成 where ID is null 的解决办法

    using (Entities com = new Entities()){     com.Configuration.UseDatabaseNullSemantics = true; } EF+M ...