接下来我们尝试实现最简单的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

邮箱:acetaohai123@163.com

 

 

 

 

 

C#应用视频教程1.2 Socket通信客户端实现的更多相关文章

  1. C#应用视频教程1.3 Socket通信客户端完善

    我们先把前面的代码封装成一个完整的类,因为跟网络相关的方法并不一定是建立socket的服务器和客户端,所以还是应该把两个分开,比如获取本机IP,修改本机IP,PING远程主机这些事情应该放在一个单独的 ...

  2. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  3. Socket通信客户端和服务端代码

    这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.G ...

  4. Socket通信客户端设计(Java)

    public class Client extends JFrame implements Runnable{ private JPanel jPanel= new JPanel(); private ...

  5. Socket通信-客户端

    WSADATA wsd; SOCKET sHost; SOCKADDR_IN servAddr; if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) retu ...

  6. php的socket通信

    socket通常叫做'套接字',用于描述IP地址和端口,是一个通信链的句柄.应用程序通过套接字向网络发出请求或者应答忘了请求.socket既不是程序,也不是协议,其只是操作系统提供的通信层的一组抽象A ...

  7. AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答

    一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...

  8. JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

    OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...

  9. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

随机推荐

  1. Unity 2D游戏开发教程之使用脚本实现游戏逻辑

    Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态. ...

  2. 【BZOJ 4031】 4031: [HEOI2015]小Z的房间 (Matrix-Tree Theorem)

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1089  Solved: 533 Description ...

  3. vijos Warcraft III 守望者的烦恼

    题解 转移方程好写吧 一个一维递推式 然后我们可以构造矩阵优化 嗯,最近学一下递推优化 代码 #include<cstdio> #include<cstring> #inclu ...

  4. 【BJOI2014】大融合【LCT】

    闲着没事写篇题解 传送门 LCT维护子树的模板题 树链剖分中,子树可以用dfs序维护.但LCT你总不可能动态维护dfs序啊 LCT之所以不能直接维护子树,是因为LCT只能维护它的重儿子.我们把这棵子树 ...

  5. Codeforces Round #305 (Div. 1) B. Mike and Feet 单调栈

    B. Mike and Feet Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/547/pro ...

  6. 蓝屏代码详解(更新WIN7蓝屏代码)

    6位代码含意 0 0x0000 作业完成.  1 0x0001 不正确的函数.  2 0x0002 系统找不到指定的档案.  3 0x0003 系统找不到指定的路径.  4 0x0004 系统无法开启 ...

  7. python核心模块之pickle和cPickle解说

    pickle模块使用的数据格式是python专用的,而且不同版本号不向后兼容,同一时候也不能被其它语言说识别.要和其它语言交互,能够使用内置的json包使用pickle模块你能够把Python对象直接 ...

  8. [js插件]分享一个文章内容信息提示插件Colortip

    引用 项目中需要一个信息提示的功能,就上网找了一个插件,发现colortip实现比较简单,就定了这个插件. 实现过程 官网:http://tutorialzine.com/2010/07/colort ...

  9. 【mybatis】mysql级联更新两个表或多张表的数据

    例如 info表和relation表有关联,现在要在一个sql语句中同时级联更新两张表的数据 update security_code_info info LEFT JOIN security_cod ...

  10. FAQ:领域服务和应用服务的职责是什么?

    问答部分 问: 领域服务的职责是什么? 答: 夸聚合实例业务逻辑. 没办法合理放到实体中的其它业务逻辑. 问: 领域服务的设计原则是什么? 答: 用来组织业务逻辑. 面向业务逻辑. 细粒度. 内部视图 ...