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.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...
随机推荐
- 【BZOJ 4455】 4455: [Zjoi2016]小星星 (容斥原理+树形DP)
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 426 Solved: 255 Description 小Y是 ...
- 【二分答案】【DFS】【分类讨论】Gym - 100851F - Froggy Ford
题意:河里有n块石头,一只青蛙要从左岸跳到右岸,你可以再在任意一个位置放一块石头,使得在最优方案下,青蛙单步跳的距离的最大值最小化,输出该位置. 将原图视作完全图,二分答案mid,然后在图中只保留小于 ...
- 【BZOJ】1042: [HAOI2008]硬币购物
1042: [HAOI2008]硬币购物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3307 Solved: 2075[Submit][Stat ...
- VK Cup 2016 - Qualification Round 1 (Russian-Speaking Only, for VK Cup teams) C. Promocodes with Mistakes 水题
C. Promocodes with Mistakes 题目连接: http://www.codeforces.com/contest/637/problem/C Description During ...
- hust 1385 islands 并查集+搜索
islands Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/problem/show/1385 Descri ...
- iOS自定义全屏返回与tableView左划删除手势冲突解决
当自定义一个navigationController实现全屏右划返回时, 使用起来是不是很爽, 代码如下: - (void)viewDidLoad { [super viewDidLoad]; UIG ...
- iOS 反反注入 修改__RESTRICT,__restrict工具
通过在 Xcode 里的 Other Linker Flags 设置参数,可以防止App被注入dylib(仅限于iOS 10 以下系统) 比如,某艺,XX音乐等 dylib无法注入,也就意味着没办法 ...
- mui 图片预览
1. 图片放大滑动预览需要 mui.zoom.js mui.previewimage.js 2. 调用 mui.previewImage(); 3. 滑动过程中禁止图片缩放 注释掉下面代 ...
- Div+CSS展示物流跟踪轨迹信息
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- java获取指定日期之前或之后的时间
/** * 前/后?分钟 * * @param d * @param minute * @return */ public static Date rollMinute(Date d, int min ...