----tcp(传输 控制 协议)是可靠消息:三次握手(发给对方,对方发给自己,证明对方接到消息,在发给对方,说明自己能接到对方消息,这样就都知道了):tcp:每发送一次消息,对方都会回复,证明接受到了所以是可靠地;包含许多校验,效率差;

---(UDP:用户 数据报 协议)数据报文服务:消息发送给对方就完事了,不管你是否接收到;

不可靠,但是效率高;

-----应用层协议:Http,Ftp,Popj SMTp

-----传输层:TCP,ICMP,UDP

-----网络层:IP,ARP ;

socket是应用层和传输层之间的交互;

---端口:三类:工人端口、注册端口、动态私有端口(这些可以用)

---套接字指的是socket;封装的网络插口;

----服务端:1创建socket,绑定端口和ip;打开监听,接受客户端;

----客户端:创建socket,链接服务器,创建ip端口,进行链接;

--服务器端接受科幻段消息时,创建socketProxy对象,占用系统自动分配的

一个端口,发送消息时重新占用新的端口,原来端口继续监听;

--说白了,监听端口收到消息创建新的socket对象,并绑定新的端口进行通信

--这个端口就帮死了,传递接受都用这一个端口),

而监听端口继续监听,

public partial class Form1 : Form

{

List<Socket> list = new List<Socket>();

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

}

private void button1_Click(object sender, EventArgs e)

{

string ip = "192.168.1.1";

//创建ip地址:

IPAddress ipAddress = IPAddress.Parse(ip);

//创建端口

IPEndPoint ipPoint = new IPEndPoint(ipAddress, 3030);

//穿点套接字:

//参数1:寻址方式;参数2:socket传输方式:stream tcp方式,Dgram:数据报方式,第三个参数:协议

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//绑定端口和ip

s.Bind(ipPoint);

//开始监听:(请求最大连接长度),s为委托参数;

ThreadPool.QueueUserWorkItem(new WaitCallback(Accept), s);

}

public void Accept(object obj)

{

Socket socket = (Socket)obj;

while (true)

{

//接受客户端的一个连接创建代理套接字

Socket proxys = socket.Accept();

//存储这些通信管道;

list.Add(proxys);

//获取套接字端口和ip;

// proxys.RemoteEndPoint.ToString();

ThreadPool.QueueUserWorkItem(new WaitCallback(AcceptStarts), proxys);

}

}

public void AcceptStarts(object obj)

{

Socket socket = (Socket)obj;

while (true)

{

//通过判断异常来判断,是否客户端已中断,来关闭服务端的socket;

try

{

byte[] buffer = new byte[1024 * 1024];

int realLength = socket.Receive(buffer, 0, buffer.Length, SocketFlags.None);

string strResult = Encoding.Default.GetString(buffer, 0, buffer.Length);

}

catch

{

socket.Close();

//异常已失效断开的socket;

list.Remove(socket);

}

}

}

private void button2_Click(object sender, EventArgs e)

{

//发送消息

foreach (Socket s in list)

{

//防止socket断开失效;

try

{

string str = "发送内容";

byte[] bytes = Encoding.Default.GetBytes(str);

s.Send(bytes, SocketFlags.None);

}

catch

{

s.Close();

//异常已失效断开的socket;

list.Remove(s);

}

}

}

}

--------------------客户端

public partial class 客户端 : Form

{

public Socket CurrentSocket { get; set; }

public 客户端()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

Socket socket =null;

try

{

IPAddress ipAddress = IPAddress.Parse("192.168.1.1");

IPEndPoint endpoint = new IPEndPoint(ipAddress, 8080);

//创建socket;

socket= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

socket.Connect(endpoint);

CurrentSocket = socket;

}

catch

{

if (socket != null)

{

socket.Dispose();

}

}

}

private void button2_Click(object sender, EventArgs e)

{

byte[] bytes = Encoding.Default.GetBytes("sdfsdfd");

if (CurrentSocket != null)

{

try

{

CurrentSocket.Send(bytes, 0, bytes.Length, 0);

}

catch

{

CurrentSocket.Dispose();

}

}

}

}

socket传递的数据都是byte[]数组类型;

服务器端通过捕获异常来知道客户端关闭连接;

Encoding.Default.GetBytes();

----503错误:访问人数过多

--------

-------------字节块拷贝: //字节块拷贝:

byte[] a = new byte[1024];

byte[] b = new byte[1025];

b[0] =1;//这样可以说是自定义协议;第一个位代表什么意思;接受时根据第一个字节判断是传送的什么数据文件(比如1代表图片)

Buffer.BlockCopy(a, 0, b,1,a.Length);

---魔鬼数字:1代表什么2代表什么,千万别使用,通常使用枚举;

C# socket通信随记回顾的更多相关文章

  1. asp.net请求响应模型原理随记回顾

    asp.net请求响应模型原理随记回顾: 根据一崇敬的讲师总结:(会存在些错误,大家可以做参考) 1.-当在浏览器输入url后,客户端会将请求根据http协议封装成为http请求报文.并通过主sock ...

  2. VS下使用Google Protobuf完成SOCKET通信

    如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 出处:如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 最近一 ...

  3. QT创建TCP Socket通信

    最近在学习QT,了解到QT可以进行SOCKET网络通信,进行学习,并建立一个简单的聊天DEMO.为了测试是否能与VS2012下的程序进行通信,在VS2012下建立一个客户端程序,进行通信测试,发现可以 ...

  4. TCP Socket通信详细过程

    下面这篇文章是参考"骏马金龙"博客中 不可不知的socket和TCP连接过程 https://www.cnblogs.com/f-ck-need-u/p/7623252.html ...

  5. Android简单实现Socket通信,client连接server后,server向client发送文字数据

    案例实现的是简单的Socket通信,当client(Androidclient)连接到指定server以后,server向client发送一句话文字信息(你能够拓展其他的了) 先看一下服务端程序的实现 ...

  6. Java多线程技术:实现多用户服务端Socket通信

    目录 前言回顾 一.多用户服务器 二.使用线程池实现服务端多线程 1.单线程版本 2.多线程版本 三.多用户与服务端通信演示 四.多用户服务器完整代码 最后 前言回顾 在上一篇<Java多线程实 ...

  7. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  8. php简单实现socket通信

    socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...

  9. Socket通信类

    package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...

随机推荐

  1. tc-SRM-626-DIV1-250

    枚举alice投掷骰子得到的结果的每一种情况极其数量. 枚举bob投掷骰子得到的结果的每一种情况极其数量. 然后枚举alice投掷骰子得到的结果的数量和bob投掷骰子比alice低的数量. 然后计算结 ...

  2. verilog中的有符号数运算

    verilog中的有符号数运算 http://hi.baidu.com/lixu1113/item/d00dc095f86aed48f142159a verilog中的有符号数运算 有符号数的计算:若 ...

  3. 数据库文档生成工具——word2chm,SqlSpec

    首先使用代码生成器可以生成word版本的数据库文档. 转成chm格式的更加小巧和方便~ SqlSpec是个好工具,可以生成所有数据库相关的信息 之后可以一键生成chm文档.

  4. 《Java并发编程实战》第十四章 构建自己的同步工具定义 札记

    一.状态依赖性的管理 有界缓存实现的基类 @ ThreadSafe public abstract class BaseBoundedBuffer<E> { @GuardeBy( &quo ...

  5. Node.js新手教程——怎样实现文件上传功能

    作者:zhanhailiang 日期:2014-11-16 本文将介绍怎样使用Node.js实现文件上传功能. 1. 初始化项目信息:npm init [root@~/wade/nodejs/node ...

  6. NYNU_省赛选拔题(3)

    题目描述 二叉树,若其与自己的镜像完全相同,就称其为镜像树. 是一棵镜像树:而 不是镜像树.现给你一棵二叉树,请你判断其是不是镜像树. 输入 第一行是一个整数数T,表示测试数据有多少组每组数据第一行是 ...

  7. error:stray&#39;\243&#39;in program

    error:stray'\243'in program 问题:       C原因在编译时出现例如以下错误 error:stray'\243'in program 错误原因: 非 - 标准ascII字 ...

  8. iOS开发之protocol和delegate

     protocol--协议 协议是用来定义对象的属性,行为和用于回调的.     协议中有两个keyword@private和@optional,@private表示使用这个协议必需要写的方法,@op ...

  9. LeetCode:same_tree题解

    一.     题目: 给定两个二叉树,编写一个函数来检查它们是否相等或为空树.假设两个二叉树被觉得是相等的,那么它们在结构上是同样的,而且随意节点具有同样的值. 二.     分析 非常easy的题目 ...

  10. SVN & Git (一)

    (一)SVN的使用.CornerStone图形化管理工具! SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. ...