伏鹏飞

疑难杂症博物馆,.net老司机

Blog

13 Jan 2020

有关tcp通讯问题的答疑解惑

这篇文章是分享了我多年来从学习和使用tcp的过程中,遇到的问题,以及处理方式。 首先很多刚接触TCP的新手会习惯性的进入一个思维惯性:发送一个数值接收一个返回值;比如我们调用webservice、调用webapi;在tcp通讯过程中,虽然可以是请求+应答的,但这是一个无需且无状态的过程。什么意思呢,我给大家举个例子: 现在有两个人分别为A、B,A为客户端,B为服务端。A喊出:请回答;B应答:我在。理想情况下: A:请回答 B:我在 A:请回答 B:我在 A:请回答 B:我在 …..一直循环下去。 但是B应答给A时,出现了网络波动,就会出现 A:请回答 A:请回答 B:我在 B:我在 A:请回答 B:我在 ….. 次序错乱了。A不能准确的收到B的应答。 在tcp的传输过程中是以字节流发送和接收,那么每次收到的字节流可能不是完整的,有可能是部分的或者是上次对方应答的字节流+本次应答的部分字节流(其实就是粘包)。这种情况下,我们无法从字节流还原到想要的信息。为什么tcp会这样呢,因为tcp是传输层协议,只保证传输数据送达并且保证流次序,并不处理具体的传输字节表达的内容;而我们使用的http协议是应用层的协议属于上层协议。...

08 Jan 2020

一场http与tcp的交互

今天写给大家一些干货。场景是这样的:客户需要http的方式对接我们原有的的一个程序,但是我不想每台机器上都部署IIS服务,因为这样会增加部署复杂度和成本。而且也不能保证每个机器都可以部署成功。于是我想换一种方式来应答对方程序的请求。于是有了以下尝试: 我使用tcp工具建立一个端口为6000的监听服务,再用浏览器访问 http://127.0.0.1:6000这个地址。可以发现tcp工具获得到了浏览起的请求信息。 我们在尝试将访问的地址改为:http://127.0.0.1:6000?para1=123。 可以看到在tcp工具中可以获得到请求的参数信息。如下图: 经过上面的尝试,我们发现用tcp服务来监听http请求这个方法是可行的,有兴趣的同学可以使用postman这个工具来尝试各种get请求或者post提交请求,来看看tcp服务到底会收到什么样格式的数据。 ##那么我们怎么来响应对方的http的请求呢? 假设业务上我们需要给对方返回的http状态有: 成功200、未找到页面或者文件404、服务器内部错误400、无需操作304;在返回类型上需要:普通的文本、本地文件。那么我们只要按照如下格式返回给对方: byte[] buffer = new byte[1024]; int revCount = client.Available; int revLen...

07 Jan 2020

有关goto语句的一点思考

刚开始接触编程的时候是从C语言入门,当时老师提到过goto语句的危害,后来也就一直没有用到过goto语法;直到这两天看到一份别人写的代码如下: //部分代码 int tryCount = 3; //至多3次重传机会 //Send command tt: commPort.Write(commandByte, 0, command.Count); DelegateState.InvokeDispatchStateEvent(BitConverter.ToString(commandByte), Color.Black); System.Threading.Thread.Sleep(500); //check command byte[] buffer...

06 Jan 2020

说一说WPF中使用多个MediaElement遇到的问题

背景 一款广告播放器的需求:可以循环播放多个视频当每个视频播完后立即播放下一个,中间不得有黑屏过程。 ##第一版方案 申明一个MediaElement 当每个视频播放完成后(MediaEnded)事件中指定下一个视频地址 这边就不贴出代码了 结果:每个视频交替时会有长时间空白期原因:1.设置MediaElement.source后视频缓冲需要时间(VlC就没有这问题 但是VLC在wpf下只能离屏渲染播放炒鸡卡 故放弃)。2.设置soucre后调用play()会出现不发调用成功的情况(应该正在缓冲加载,这个时候调用play()失效)。 放弃第一方案 第二方案 声明多个MediaElement每个初始化时设置source,当播放摸个视频时,显示对应的MediaElement并调用play(),否则隐藏并pause(); 结果:程序打开时开的要命,内存飙升。多个视频同时缓冲 崩溃。。。。 方案优化: /// <summary> /// MainWindow3.xaml 的交互逻辑...

06 Jan 2020

说一说C#使用websocket的一些问题

本位主要记录了奔驰项目中websocket通讯改造遇到的问题。 背景 之前终端与服务器通讯采用的是tcp/ip模式,但甲方对安全性要求极高不开放tcp通讯所需要的端口,无奈之下兄弟们决定采用websocket与终端交互,这样可以使用已有的80端口。 改造 原先的Tcp客户端结构如下(部分): public class TcpStocketClient { ///<summary> /// 客户端socket对象 /// </summary> public Socket Tcpsocket; /// <summary> ///...

18 Nov 2018

拼音输入法 快速输入带音调的字符

本文告诉大家如何使用本文提供的输入法快速输入带音调的字符 在教学的应用上,很多时候都需要混合输入带音调的拼音。但是无论是哪个输入法都无法满足需求,于是我就开发了一个。 使用方法 点击下载拼音输入法 下载的是压缩文件,需要解压缩到任意的文件夹,建议不要直接解压到桌面 打开拼音输入法,此时就可以进行快速的拼音输入 如输入 海 hǎi 可以这样输入 ha3i5 在每次按下元音的时候就可以选择数字对应。在使用的时候注意关闭原有的输入法,通过 shift 键关闭就可以 在不使用拼音输入法的时候,只需要关闭拼音输入法就可以。如果想要卸载输入法,只需要删除文件就可以。 下载链接:http://image.acmx.xyz/app/pinyin.zip 如果无法下载请联系我 如果觉得不好用,有任何建议都可以发邮件给我 参考 快速在课堂活动输入拼音带音调字符...

04 Jun 2016

Example content for posts

This demo page has been used from http://jasonm23.github.io/markdown-css-themes/. A First Level Header A Second Level Header A Third Level Header...

04 Jun 2015

Test Page

This is a test blog page where we can explore how to embedd images in the blog. Image example 1...