浅谈C#Socket
好不容易把socket通信搞懂一点,比较喜欢做笔记,嘿嘿~
socket通信是C#中非常基础的一个知识点,我这里用到的是基于Tcp协议的socket通信。Tcp会有三次握手连接通信.
一、 创建服务端socket的步骤:
1.首先需要引用socket通信中所用到的名称空间;
using System.Net;
using System.Threading;
using System.Net.Sockets;
这三个名称空间是为socket通信打基础,没有这三个名称空间无法实现socket通信.
2.接下来就是要创建一个socket的对象了,创建socket对象是为了方便客户端与服务端之间的通信,如果你还不明白,就请往下继续看;
Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
在这里面有几个知识点我要补充一下:
socket类中的参数我做简要阐述,AddressFamily.InterNetwork简单来说就是使用内网,啥,你不知道内网是什么东东?至于内网是啥,内网就是不能上互联网的局域网;SocketType.Stream是流式的套接字类型,这种套接字类型是一种可靠且双向,基于连接的字节流,不重复数据,简单一点就是支持双向通信;ProtocolType.Tcp指的是使用基于tcp协议的通信协议。
3.绑定IP地址和端口号;
//将字符串类型的IP地址转换为IPAddress类型
IPAddress ip = IPAddress.Parse("173.168.5.15");
//标识网络地址
EndPoint point = new IPEndPoint(ip,port);
serverSocket.Bind(point);
如果你想实现socket通信就必须绑定IP地址和端口号,IP地址是计算机的通信地址,端口号指向计算机中某个软件或者说是应用程序;
4.监听客户端的连接;
serverSocket.Listen();
参数指的是监听客户端的最大数量。
5.为连接到的客户端新建一个socket;
Socket ListenClientSocket= serverSocket.Accept();
这是规定,如果不新建一个socket无法通信。
这一步完成时客户端给服务端发送消息且客户端会连接到服务端,完成第一次握手。
6.向客户端发送消息;
ListenClientSocket.Send(data);
此时服务端给客户端发送消息完成第二次握手。
7.接受客户端消息;
byte[] data2 = new byte[];
int length=ListenClientSocket.Receive(data2);
string message2=Encoding.UTF8.GetString(data2,,length);
Console.WriteLine("接收到客户端传来的消息:"+message2);
服务端接收到客户端的消息完成第三次握手。
服务端socket 完整代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;
using System.Net.Sockets; namespace serverSocketTest2
{
class Program
{
static int port = ;
static void Main(string[] args)
{
//创建一个socket的对象
Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//将字符串类型的IP地址转换为IPAddress类型
IPAddress ip = IPAddress.Parse("173.168.5.15");
//标识网络地址
EndPoint point = new IPEndPoint(ip,port);
serverSocket.Bind(point);
//开始监听
serverSocket.Listen();
Console.WriteLine("等待客户端连接..."); //为连接客户端需要新建一个线程
Socket ListenClientSocket= serverSocket.Accept();//暂停当前线程,等待客户端连接之后再执行之后的语句
Console.WriteLine("客户端连接成功! 真是令人振奋!");
//传送的消息
string message = "Hello Client!";
//将字符串类型的数据转换为byte类型的数组
byte[] data=Encoding.UTF8.GetBytes(message);
//发送消息
ListenClientSocket.Send(data); /////接受客户端数据
byte[] data2 = new byte[]; int length=ListenClientSocket.Receive(data2);
string message2=Encoding.UTF8.GetString(data2,,length);
Console.WriteLine("接收到客户端传来的消息:"+message2); Console.ReadKey();
}
}
}
二、 创建客户端socket的步骤如下:
1.引用进行socket通信的名称空间;
using System.Net;
using System.Threading;
using System.Net.Sockets;
原因我不再赘述了,相信聪明的你们都懂.
2.客户端向服务端发送连接的请求,建立客户端和服务端的连接;
clientSocket.Connect(ip,port);
这是第一次握手。本次握手与服务端里的第一次握手同步执行,其实这次握手也是服务端里的第一次握手。
3.接收数据;
clientSocket.Receive(data);
在这里需要将客户端接收到的数据返回一个长度并存储到byte数组里。
4.将字节型数据转换成字符串型的数据;
string message=Encoding.UTF8.GetString(data,,length);
5.发送数据
clientSocket.Send(data2);
第二次握手连接。本次握手与服务端里的第二次握手同步执行,其实这次握手也是服务端里的第二次握手。
客户端socket 完整代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;
using System.Net.Sockets; namespace clientSocketTest2
{
class Program
{
static int port = ;
static void Main(string[] args)
{
//新建一个socket
Socket clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse("173.168.5.15"); //客户端向服务端发送连接的请求,建立客户端和服务端的连接
clientSocket.Connect(ip,port);
//存储数据,接收数据
byte[] data=new byte[];
int length=clientSocket.Receive(data);
//转换为字符串型的数据
string message=Encoding.UTF8.GetString(data,,length);//0,length 表示的是发送的数据的长度
Console.WriteLine("接收到来自服务端的数据:"+message); /////// 发送数据
string message2 = Console.ReadLine();
byte[] data2=Encoding.UTF8.GetBytes(message2);
clientSocket.Send(data2); Console.ReadKey(); }
}
}
这是我的理解,如果有不足的地方,请指教,共同学习!希望共同进步!
浅谈C#Socket的更多相关文章
- 浅谈tcp socket的backlog参数
最近看netty源码碰到ChannelOption.SO_BACKLOG参数,通过跟踪代码发现其实是用于设置底层tcp socket的backlog参数,由于不了解这个参数,有必要彻底的理解一下. 底 ...
- 浅谈android Socket 通信及自建ServerSocket服务端常见问题
摘 要:TCP/IP通信协议是可靠的面向连接的网络协议,它在通信两端各建立一个Socket,从而在两端形成网络虚拟链路,进而应用程序可通过可以通过虚拟链路进行通信.Java对于基于TCP协议的网络通 ...
- [转]浅谈Flash Socket通信安全沙箱
用过Flash socket的同学都知道,Flash socket通讯有安全沙箱问题.就是在Flash Player发起socket通信时,会向服务端获取安全策略,如果得不到服务端响应,flash将无 ...
- 浅谈Socket编程
浅谈Socket编程 说到Socket,想必大家会觉得陌生又熟悉.许多同学听说过Socket,但仅仅知道它翻译成中文叫做套接字,除此之外似乎并没有太多的了解了.那么今天我就来抛砖引玉地聊一聊Socke ...
- 浅谈IM软件怎样建立安全socket连接、登录
----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...
- 浅谈JAVA中如何利用socket进行网络编程(二)
转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...
- TODO:浅谈pm2基本工作原理
TODO:浅谈pm2基本工作原理 要谈Node.js pm2的工作原理,需要先来了解撒旦(Satan)和上帝(God)的关系. 撒旦(Satan),主要指<圣经>中的堕天使(也称堕天使撒旦 ...
- [转]浅谈https\ssl\数字证书
浅谈https\ssl\数字证书 http://www.cnblogs.com/P_Chou/archive/2010/12/27/https-ssl-certification.html 全球可信的 ...
- Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈
一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢? 本文浅谈个人观点,可能有误,欢迎拍砖,共同 ...
随机推荐
- Word2013中制作按钮控件
1.由于“开发工具”不经常用,所以在功能选项面板中没有“开发工具”这一栏.所以我们需要设置.在功能选项面板中选择“文件”,在跳转出来的版面中选择“选项”.
- java 关键字 assert的学习
之前在学习java源码时,发现了assert这个不常用的关键字.下面直接来介绍下这个关键字的使用. assert是什么? 它是jdk1.4之后新增加的关键字,没了. assert的作用是什么? ass ...
- bootstraptable插件文档的坑
1.事件onCheck中文档参数为row, $element正确的顺序为$element,row eg: $Table.on('check.bs.table', function ($element, ...
- MS CRM 2013 Plugin 注册工具登录后空白
解决办法 把en-us, zh-CN 目录随便改个名字就好了
- python之信用卡ATM(第五天)
本节作业 作业需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日, ...
- eclipse连hadoop2.x运行wordcount 转载
转载地址:http://my.oschina.net/cjun/blog/475576 一.新建java工程,并且导入hadoop相关jar包 此处可以直接创建mapreduce项目就可以,不用下面折 ...
- MVC系列1-MVC基础 (ASP.NET)
终于决定写一个系列的文章了,最开始其实是准备写一下WPF的,因为我这两年一直在做WPF,对WPF的喜爱自然是无以言表.但是由于我所在的地区对WPF的普及不是很广泛,所以,被迫又开始做起来web,但是我 ...
- 学习Linux系列--Python资源收集
本系列文章记录了个人学习过程的点点滴滴. 回到目录 玩Linux,不懂一门脚本语言是不行的,我这里选择的是Python. 10.入门资源 下面前三遍是比较系统的文档,后面是一些心得,我看了好几天,终于 ...
- Scala学习资源
Scala学习资源: Scala官方网站:http://www.scala-lang.org/ Scala github:https://github.com/scala/scala Twitter ...
- ubuntu 设置 默认的JDK路径
首先查询有多少种JDK已经被安装了 sudo update-alternatives --list java 其次 配置你想默认的JDK sudo update-alternatives --conf ...