接下来我们尝试实现最简单的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. 火焰图&perf命令

    最近恶补后端技术,发现还是很多不懂,一直写业务逻辑容易迷失,也没有成长.自己做系统,也习惯用自己已知的知识来解决,以后应该多点调研,学到更多的东西应用起来. 先学一个新的性能分析命令. NAME pe ...

  2. Java 8中你可能没听过的10个新特性

    lambda表达式,lambda表达式,还是lambda表达式.一提到Java 8就只能听到这个,但这不过是其中的一个新功能而已,Java 8还有许多新的特性——有一些功能强大的新类或者新的用法,还有 ...

  3. 矩阵&行列式

    # 代数 排列 对换,对于一个排列操作,对于一个偶排列一次对换之后变为奇排列 反之变为偶排列 行列式 N阶行列式室友N^2个数aij(i,j = 1,2,3,...n) 行列式的数=\(\sum_ { ...

  4. Mac 下解压NDK .bin文件

    Mac Android Studio 开发NDK,首先下载NDK文件----->android-ndk-r10d-darwin-x86_64.bin 1.打开终端获取文件权限 chmod a+x ...

  5. Codeforces Round #346 (Div. 2) B. Qualifying Contest 水题

    B. Qualifying Contest 题目连接: http://www.codeforces.com/contest/659/problem/B Description Very soon Be ...

  6. extjs form textfield的隐藏方法

    只需将textfield的hidden和hideLabel配置为true就可以了.只设置hidden:true时会显示出来一个:的标签.     this.formpanel = new Ext.Fo ...

  7. 复制到剪切板js代码(转)

    <script type="text/javascript" language="javascript"> //复制到剪切板js代码 functio ...

  8. MySql清空表的方法介绍 : truncate table 表名

    清空某个mysql表中所有内容 delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate tabl ...

  9. Small tips of APP H5 page

    在开发日常落地页的时候,每当碰到一些很酷炫的宣传图用css实现很复杂且耗时的时候,一般采取切图然后将其放在页面中,在这个过程中发现<img/>标签中图片下方会有一行小空白,影响了与后一部分 ...

  10. warning: suggest parentheses around assignment used as truth value

    编译时的警告如下: