Socket异步通信学习三
接下来是客户端部分,采用同步接收模式,在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异步通信学习三的更多相关文章
- Socket异步通信学习一
最近在做一个频谱管理项目,负责通信模块,自己也是小白,重头学起,直至今天通信基本框架已经完成,把自己在学习中的心得与大家分享一下,做一个socket系列的博文,顺便加固一下自己对socket通信的认识 ...
- Socket异步通信学习二
接下来是服务器部分,采用异步模式,新建了一个AsynServer类,用于存放socket服务器代码,主要有4个方法: 有一个全局socket,下面四个方法中都用到. Socket socket = n ...
- HTTP学习三:HTTPS
HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...
- socket异步通信-如何设置成非阻塞模式、非阻塞模式下判断connect成功(失败)、判断recv/recvfrom成功(失败)、判断send/sendto
socket异步通信-如何设置成非阻塞模式.非阻塞模式下判断connect成功(失败).判断recv/recvfrom成功(失败).判断send/sendto 博客分类: Linux Socket s ...
- TCP协议和socket API 学习笔记
本文转载至 http://blog.chinaunix.net/uid-16979052-id-3350958.html 分类: 原文地址:TCP协议和socket API 学习笔记 作者:gilb ...
- C#高性能大容量SOCKET并发(三):接收、发送
原文:C#高性能大容量SOCKET并发(三):接收.发送 异步数据接收有可能收到的数据不是一个完整包,或者接收到的数据超过一个包的大小,因此我们需要把接收的数据进行缓存.异步发送我们也需要把每个发送的 ...
- LInux下socket编程学习笔记
1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...
- TweenMax动画库学习(三)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) ...
- Struts2框架学习(三) 数据处理
Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...
随机推荐
- Tomcat配置JNDI数据源
经过3个多小时的努力,配置JNDI数据源(主要是通过DBCP连接池)终于搞定-还是Tomcat官方的说明好,不过全是英文的,大概还看得懂.百度上那么花花绿绿的太多了,一个也没成功!...本例使用的数据 ...
- HDU 4565 So Easy!
So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 【Python】Python-skier游戏[摘自.与孩子一起学编程]
这是一个滑雪者的游戏. skier从上向下滑,途中会遇到树和旗子,捡起一个旗子得10分,碰到一颗树扣100分,可以用左右箭头控制skier方向. 准备素材 一 准备python环境:我下载的pytho ...
- HUST 1017 Exact cover dance links
学习:请看 www.cnblogs.com/jh818012/p/3252154.html 模板题,上代码 #include<cstdio> #include<cstring> ...
- 【原】Redis事务管理
Redis高级篇 事务 MULTI, EXEC, DISCARD and WATCH命令用于保证Redis中的事务处理 一个事务中的所有命令被序列化并串行执行. 事务的原子性. 用法 MULTI ...
- Hadoop文件系统常用命令
1.查看指定目录下内容 hadoop dfs –ls [文件目录] eg: hadoop dfs –ls /user/wangkai.pt 2.打开某个已存在文件 hadoop dfs –cat [f ...
- 题目1023:EXCEL排序(多关键字+快排+尚未解决)
http://ac.jobdu.com/problem.php?pid=1023 题目描述: Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行“Ca ...
- 2.2CUDA-Memory(存储)和bank-conflict
在CUDA基本概念介绍有简单介绍CUDA memory.这里详细介绍: 每一个线程拥有自己的私有存储器,每一个线程块拥有一块共享存储器(Shared memory):最后,grid中所有的线程都可以访 ...
- r语言入门资料
最近有好多r语言的爱好者问我r语言的事情,在百度上简单的收一收,感觉都在扯淡,真正适合初学者入门的资料几乎没有,比如最开始用什么编辑器比较好,在哪下载,最开始学习的例子有什么? 在日本网站上反倒是找 ...
- 包含到cocos2d-x里的tcpsocket源码
声明:本文参考了langresser发布的blog“跨平台的游戏客户端Socket封装” Socket处理是异步非阻塞的,所以可以放心的放到主线程处理消息,并且在原作者的基本上进行了系列优化,考虑了客 ...