C#应用视频教程1.2 Socket通信客户端实现
接下来我们尝试实现最简单的Socket客户端,为了确保只可能你的代码有问题,服务器要先用别人成熟的代码测试(这也是编程的一个技巧,先不要用自己写的客户端测试自己写的服务器,这样出了问题你也不知道谁有问题,也可能都有问题,而是一样一样来,拿不准的先用别人的),先开启这个Socket服务器

尝试连接到服务器,只要参照网上的做法,调用Socket的connect方法和disconnect方法即可(把指定的IP地址和端口按照要求转成IPEndPoint类型),可以发现SocketTest软件确实就不但的提示New Client和Client closed connection,这也是我们后面要学习的,做客户端的时候如果连接成功了要提示,做服务器如果有客户端连接成功了也要提示。

如果为了更加严谨可以在转换之前先判断是否是合格的IP地址和端口,IP地址网上可以找到很多检测的手段,每个XXX.XXX数值有限制就行了,端口我这里填写的1234,其实也可以填写更大或者更小,具体最大值最小值没有研究过,但是不要填一些已经默认被占用的端口,比如80端口默认是http协议,21是默认的ftp端口,打开它的软件的Port可以看到常规的对TCP端口的定义,这些端口不要占用

连接完了之后就是考虑给服务器发消息,发送数据也比较简单,注意不能直接发送字符串,而是要转成byte数组(读者可以去看相关的文字,为什么要转成byte数组,可能考虑不同的操作系统,软件对文本的处理方式不同,所以需要弄成通用的byte字节流),此外可以发现简单的Send方法是不支持中文的,他接受到的东西是乱码(这个问题我们以后再考虑)

发送完成之后就要考虑接受服务器的数据。接收数据比发送麻烦的多,我们这里演示了最简单的接收方法(s.Recieve),用户一旦点击了接收的按钮,则窗口都不能动了,这也是同步Socekt通信的最大的特点(就是收到完毕之后才会接下去干别的) 。

读者还是想象成宾馆的房间,如果客户端没有Recieve,服务器就是往里发数据了,发完了之后客户端才Recieve会怎么样?测试可以发现如果是服务器先往Socket扔东西,客户端接收就会立即执行,当然s.Recieve方法一旦执行完毕,也就不阻塞了,窗口立即能动

通过上面两步的测试,我们发现接收数据会导致程序卡死,那么如何解决Receive方法导致的整个程序卡死的问题呢?(事实上根本不应该用户点击了接收才执行接收,而是随时可以接收服务器发过来的数据,如同我们可以随时给服务器发消息一样),最简单的方法就是把会卡死的部分放到一个线程中去执行,下面我们只要连接成功,就会启动线程并陷入死循环,在线程中Recieve的阻塞不会导致主程序的卡死

但是采集到数据之后如何更新到主界面的东西呢?我们如果在线程中去更新主界面label,textbox都是会报错的,一旦服务器点击了发送按钮,我们想要更新程序的界面文本框,标签之类的会提示从不是创建控件的线程访问它

如果读者上网查,在程序初始化的时候加上这一条"关闭跨线程访问控件检测"是最简单粗暴的解决办法,但是实际上读者如果做实际项目,有很多个线程用这种方式去更新界面的控件,程序是不稳定的(你测试一个小时可能没问题,你连续运行三天就不一定了)。我们下一节会结合事件和委托的方法一并处理这个问题。

更多教学视频和资料下载,欢迎关注以下信息:
我的优酷空间:
http://i.youku.com/acetaohai123

我的在线论坛:
http://csrobot.gz01.bdysite.com/

问题交流:
QQ:910358960
C#应用视频教程1.2 Socket通信客户端实现的更多相关文章
- C#应用视频教程1.3 Socket通信客户端完善
我们先把前面的代码封装成一个完整的类,因为跟网络相关的方法并不一定是建立socket的服务器和客户端,所以还是应该把两个分开,比如获取本机IP,修改本机IP,PING远程主机这些事情应该放在一个单独的 ...
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- Socket通信客户端和服务端代码
这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.G ...
- Socket通信客户端设计(Java)
public class Client extends JFrame implements Runnable{ private JPanel jPanel= new JPanel(); private ...
- Socket通信-客户端
WSADATA wsd; SOCKET sHost; SOCKADDR_IN servAddr; if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) retu ...
- php的socket通信
socket通常叫做'套接字',用于描述IP地址和端口,是一个通信链的句柄.应用程序通过套接字向网络发出请求或者应答忘了请求.socket既不是程序,也不是协议,其只是操作系统提供的通信层的一组抽象A ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...
随机推荐
- 二分+并查集【bzoj3007】[SDOI2012]拯救小云公主
Description 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意 ...
- bWAPP练习--injection篇SQL Injection (GET/Search)
SQL注入: SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到 ...
- NetBIOS主机名扫描工具nbtscan
NetBIOS主机名扫描工具nbtscan NetBIOS主机名是NetBIOS协议为主机分配的名称.通过NetBIOS主机名,系统可以利用WINS服务.广播及Lmhost文件等多种模式将NetB ...
- zstuoj 4245 KI的斐波那契
KI的斐波那契 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 550 Solved: 208 Description KI十分喜欢美丽而优雅的斐波那 ...
- FastReport.Net使用:[27]样式使用
样式设置与使用 1.打开样式设置界面,通过 报表->样式 来打开. 2.样式设置包含:边框,填充,字体和文本颜色.假如不需要某项设置,可将其选择框去掉. 3.设置好样式后,将标题的style设置 ...
- [BZOJ4338][BJOI2015]糖果(扩展Lucas)
先求出式子$P_{C_{K+m-1}^{m}}^{n}$,然后对于排列直接$O(n)$求解,对于组合用扩展Lucas求解. 但这题数据并没有保证任何一个模数的质因子的$p^k$在可线性处理的范围内,于 ...
- 【四边形不等式】POJ1160[IOI2000]-Post Office
[题目大意] v个村庄p个邮局,邮局在村庄里,给出村庄的位置,求每个村庄到最近邮局距离之和的最小值. [思路] 四边形不等式,虽然我并不会证明:( dp[i][j]表示前i个村庄建j个邮局的最小值,w ...
- 【最小生成树】BZOJ1682[Usaco2005 Mar]-Out of Hay 干草危机
...最小生成树裸题,9月最后一天刷水刷水. #include<iostream> #include<cstdio> #include<algorithm> usi ...
- python学习一月总结_汇总大牛们的思想_值得收藏
''' 下面是我汇总的我学习一个月python(version:3.3.2)的所有笔记 你可以访问:http://www.python.org获取更多信息 你也可以访问:http://www.cnbl ...
- Ext.js 中 25种类型的Ext.panel.Tool
通过Ext.panel.Panel的tools配置项来设置Ext.panel.Tool实例. 要注意的一点是,Ext框架提供的Ext.panel.Tool仅包含按钮图标而具体的点击事件处理函数需要我们 ...