浅谈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等)进行交互并将结果返回给用户的呢? 本文浅谈个人观点,可能有误,欢迎拍砖,共同 ...
随机推荐
- 浅析MySQL中exists与in的使用
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...
- 微信接口php
官方提供的SDK只有一个文本消息功能,我们将所有消息的消息类型及事件响应都整理了进来,并且加入日志记录,代码如下: 更新日志: 2013-01-01 版本1.0,包含Token验证及基本消息接口的收发 ...
- 使用C#反射中的MakeGenericType函数,来为泛型方法和泛型类指定(泛型的)类型
C#反射中的MakeGenericType函数可以用来指定泛型方法和泛型类的具体类型,方法如下面代码所示这里就不多讲了,详情看下面代码一切就清楚了: using System; using Syste ...
- Configure Visual Studio 2013 for debugging .NET framework
https://referencesource.microsoft.com/ In order to configure Visual Studio 2013 do the following in ...
- [转] How to debug a ARM Cortex-M hard fault exception
how to debug a ARM Cortex-M hard fault exception
- MySQL字符集转换(latin1到utf8)
http://blog.chinaunix.net/uid-25266990-id-3344584.html
- maven项目和普通项目转换
- HTML初步入门
标签元素 标签介绍 html元素包括一个或一对标签定义的包含范围.而标签就是由两个字符串"<"和">"号组成,标签包括开始标签"<& ...
- Android setVisibility()
android view setVisibility(): 有三个参数:Parameters:visibility One of VISIBLE, INVISIBLE, or GONE,想对应的三个常 ...
- iis发布后,未能找到编译器可执行文件 csc.exe
iis 未能找到编译器可执行文件 csc.exe在一台新安装完的Windows Server 2003上,打上Framework 3.5,配置好WebService的IIS,结果浏览时出现:未找到编译 ...