利用Socket通信
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
--------来自百度百科
套接字:源IP地址和目的IP地址以及源端口号和目的端口号的组合。
做Socket通信,需要用到C#提供的一个类Socket和线程的相关知识。
一、服务端
1.新建一个Socket实例,Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
这里的第一个参数设置网络寻址协议(这里用的是IP4,就是4位的IP地址),第二个参数设置数据传输的方法,第三个参数是传输控制协议。
2.socket.Bind(ipEndPoint);
Socket绑定一个IPEndPoint,需要一个主机ip地址和端口号,因为系统占了一些,所以设置的时候,设置的大一些。
IPAddress ipAddress = IPAddress.Parse("127.0.0.1".Trim());//将ip字符串转换为ip实例
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 12000);
ip地址的设置,如果设置我本地回环地址127.0.0.1应该是只能本地访问,设置为ip的话应该的局域网可访问。
3.socket.Listen(10);开始监听,10表示挂起的连续队列的个数。大概意思应该是只能有10个处于等待状态,其余的灰被抛掉。
4.socket.Accept();;接收客户端的连接,每当有用户连接,就会生成一个单独的socket负责与客户端通信。这个方法会返回那个代理socket对象;
5.socketProxy.Send(Encoding.UTF8.Getbytes(msg));
利用代理socket发送小心给对应的客户端,这里需要把数据转换为字节,至于编码格式,只要客户端和服务端一直就行了。现在一般都是用utf8;
6.socketProxy.Receive(buffer);
接受客户端发送的数据,同样以字节数组的方式接受到。
7.因为需要一直接受客户端返回的信息,所以需要开启一个线程去执行,不然主线程回卡死。
Thread thread=new Thread(receiveMsg); 参数是一个委托,可以执行用和委托类型一直的方法代替。
具体的看需要,构造函数提供了不同方式的委托。
这里需要注意的是,如果是带参数的委托,是利用thread.Start(params);方法传的。
这里是一个参数Object类型的,如果需要传递多个参数可以把他们封装成一个类,因为所有的类都直接或间接的继承自Object。
根据里氏替换原则,子类是可以赋值给父类的,只需在方法里再转会子类类型就行了。
这里还说一下前台线程和后台线程的区别,
程序关闭时,所有前台线程必须执行完才能关闭,而后台线程可随时可以关闭。系统给C#程序的主线程是一个前台线程。
程序所申请的线程默认也是前台的,可以通过IsBackground属性更改。
因为这里所开启的线程是接受数据,而且是写了一个死循环来接受数据,所以应该后太线程。不影响程序的关闭。
二、客户端
1.Socket client=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
参数和服务端的一致。
2.client.Connect(ip,port);连接服务器,这里需要提供ip地址和端口号。
3.client.Conected属性可以判断是否连接上服务器。
4.Thread thread=new Thread(receiveMsg);
同样需要开启一个线程来接受服务端的数据。一样为后台线程。
5.client.Send(bytesMsg);发送数据到服务端。
6.client.Receive(bytesReceive);
另外:
1.ShutDown();终止发送和接受,发送给对方一个空消息。
2.close();关闭连接。
3.客服端和服务端都需要注意的问题,因为申请的线程执行了一个死循环函数,
因为在程序关闭之前要先将线程关闭,不然连接资源已经释放了,还用socket接受数据就会引发错误。
thread.Abort();终止线程。
4.接受数据时,会填满指定的字节数组,即使有些数据为空。
5.窗体的位置Location要整体赋值,单独的Location.X是只读的,原因我还没查到,
通过反射工具查到Location属性上打有SettingsBindable属性。可能和这个有关。
利用Socket通信的更多相关文章
- 第10章 同步设备I/O和异步设备I/O(4)_利用I/O完成端口实现Socket通信
I/O完成端口原理见上一篇(可点击这里) 10.5.4.4 利用I/O完成端口实现Socket通信 (1)Accept和AcceptEx流程的比较 ①采用accept方式的流程示意图如下(普通的阻塞函 ...
- Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信
Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...
- c# TCP/IP协议利用Socket Client通信(只含客户端Demo)
完全是基础,新手可以随意看看,大牛可以关闭浏览页了,哈哈. TCP/IP协议 TCP/IP是一系列网络通信协议的统称,其中最核心的两个协议是TCP和IP.TCP称为传输控制协议,IP称为互联网络协议. ...
- 使用ObjectOutputStream进行socket通信的时候出现固定读到四个字节乱码的问题
问题描述: 最近在写一个通信相关的项目,服务器端和客户端通过socket进行通信.本来想利用read的阻塞特性,服务器端和客户端按照一定的流程进行文件读写.结果发现客户端或者服务器read方法一直都返 ...
- php 利用socket发送GET,POST请求
作为php程序员一定会接触http协议,也只有深入了解http协议,编程水平才会更进一步.最近我一直在学习php的关于http的编程,许多东西恍然大悟,受益匪浅.希望分享给大家.本文需要有一定http ...
- flex与C# Socket通信
原文地址:http://blog.csdn.net/LX10752p/archive/2011/04/27/6366526.aspx Socket 通信没什么好说,一个服务端,多个客户端,很容易搭建环 ...
- 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图. ...
- IOS 基于TCP的socket通信详解(原创)
最近在整理通信层相关知识,这篇文章是边整理边写的,有些地方可能不够准确,还请各位路过的大牛专家指出来.这次整理的socket通信是基于TCP的,实现方式是GCD形式,以下记录的都是些理论知识,方便自己 ...
- php 利用socket上传文件
php 利用socket上传文件 张映 发表于 2010-06-02 分类目录: php 一,利用fsockopen来上传文件 以前我写过一篇关于socket通信原理的博文http://blog.51 ...
随机推荐
- MAC 安装下载好的.gz包(不像.dmg直接双击就行了)
下载之后解压,然后在terminal里敲命令吧: 复制文件:蓝色部分为你解压文件的路径,直接拖到这里就行了$ sudo mv mysql-5.1.45-osx10.6-x86_64文件路径 /usr/ ...
- NOIP模拟 string - ac自动机
题目大意: 给n个字符串(100位以内),和一个长串s(100000位以内),求n个字符串在s中出现的次数.然后给出m次修改,每次修改s中的一个字符,对于每次修改,输出更新后的答案(修改会保存). 题 ...
- httpclient htmlunit下载单个文件
httpclient public class Download { public static void main(String[] args) throws ClientProtocolExcep ...
- 数据库版本管理工具Flyway——基础篇
Flyway 默认规约 SQL 脚本文件默认位置是项目的源文件夹下的db/migration 目录. Java 代码默认位于db.migration 包. SQL 脚本文件及Java 代码类名必须遵循 ...
- 让delphi2010操作界面回到delphi7模式
让delphi2010操作界面回到delphi7模式 在使用delphi2010的过程中,很不习惯它的窗口在一个框框内,感觉很不方便,可能是因为使用delphi7很多年了,已经习惯了delphi7的版 ...
- phpstudy2018升级MySQL5.5为5.7.24教程(图文)
原文: phpstudy2018升级MySQL5.5为5.7教程(图文) 一.MySQL官网下载MySQL5.7版本,我这里下载的是MySQL5.7.24. 二.直接到D:phpStudyPHPTut ...
- C# WPF 左侧菜单右侧内容布局效果实现
原文:C# WPF 左侧菜单右侧内容布局效果实现 我们要做的效果是这样的,左侧是可折叠的菜单栏,右侧是内容区域,点击左侧的菜单项右侧内容区域则相应地切换. wpf实现的话,我的办法是用一个tabcon ...
- hdu 3966 树链分割第一3遍
真的不好意思说话.你写得越多,对风暴各种问题泄露,更离谱,有什么错有.. .但是,仍然有一个.同时经过规范的编写清晰的代码.不能认为是理所当然... 树桩阵列版: #include<cstdio ...
- cookie登录功能实现
站点经常使用的记住我,或是一周内自己主动登录,这些功能一般都是是用cookie进行登录的!以下对此功能进行分析: package cookielogin; import java.io.IOExcep ...
- 一个Java工程师的入门级Linux命令集
0.前言 网上介绍linux的命令的文章一大堆,但是大部分都是流于命令介绍,把命令的所有参数都介绍一遍,但是其实在真正的工作中,很多参数都不会用到.本文总结了我自己常用的一些命令,这些命令都比较 ...