C# socket通信随记回顾
----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通信随记回顾的更多相关文章
- asp.net请求响应模型原理随记回顾
asp.net请求响应模型原理随记回顾: 根据一崇敬的讲师总结:(会存在些错误,大家可以做参考) 1.-当在浏览器输入url后,客户端会将请求根据http协议封装成为http请求报文.并通过主sock ...
- VS下使用Google Protobuf完成SOCKET通信
如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 出处:如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信 最近一 ...
- QT创建TCP Socket通信
最近在学习QT,了解到QT可以进行SOCKET网络通信,进行学习,并建立一个简单的聊天DEMO.为了测试是否能与VS2012下的程序进行通信,在VS2012下建立一个客户端程序,进行通信测试,发现可以 ...
- TCP Socket通信详细过程
下面这篇文章是参考"骏马金龙"博客中 不可不知的socket和TCP连接过程 https://www.cnblogs.com/f-ck-need-u/p/7623252.html ...
- Android简单实现Socket通信,client连接server后,server向client发送文字数据
案例实现的是简单的Socket通信,当client(Androidclient)连接到指定server以后,server向client发送一句话文字信息(你能够拓展其他的了) 先看一下服务端程序的实现 ...
- Java多线程技术:实现多用户服务端Socket通信
目录 前言回顾 一.多用户服务器 二.使用线程池实现服务端多线程 1.单线程版本 2.多线程版本 三.多用户与服务端通信演示 四.多用户服务器完整代码 最后 前言回顾 在上一篇<Java多线程实 ...
- 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?
这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...
- php简单实现socket通信
socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...
- Socket通信类
package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...
随机推荐
- 深入Java虚拟机——类型装载、连接(转)
来自http://hi.baidu.com/holder/item/c38abf02de14c7d31ff046e0 Java虚拟机通过装载.连接和初始化一个Java类型,使该类型可以被正在运行的Ja ...
- 1第一个Android应用程序
第一个程序从 Hello World 開始?? 或许C语言学习是从这開始的,可是书上不是这么開始的,或许起点就决定了高度?? 一.新建安卓项目 (1)选择安卓项目 (2)随便建个名字的项目,默认下一步 ...
- 以正确的方式开源 Python 项目(转)
大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清晰和无痛.我不是简单的指——“创建一个GitHub库,提 ...
- groovy install,gvm,groovysh简述(转)
1.1 安装Groovy Groovy主页:http://www.groovy-lang.org 确保本地系统安装了Java 1.1.1 在Windows系统上安装Groovy 1.创建环境变量GRO ...
- 【Hibernate步步】--一对一映射双向关联具体解释(两)
很抱歉.有两天没更新博客文章,不要写文章一天真的感觉很是空的啊.制定一个写作习惯,想改也改不掉啊.说点题外话,前两天我收到一封私人信件给朋友,我写邀请函的文章OWS文章.一种技术用于研究图标工具,这位 ...
- 【android】ImageView的src和background以及两者之间的神奇的差异
一.ImageView中XML属性src和background的差别: background会依据ImageView组件给定的长宽进行拉伸.而src就存放的是原图的大小,不会进行拉伸.src是图片内容 ...
- hdu2369 Broken Keyboard(类似dfs)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=2369">http://acm.hdu.edu.cn/showproblem.php ...
- C++ friend 用法汇总
C++这位朋友同意之类的非公共成员的机制是一个类或函数访问,根据朋友的类型分为三种类型:一般非类成员函数为好友,类成员函数为好友.类为好友. 1 内容朋友 包括报表朋友的朋友以及朋友的定义.明默的感觉 ...
- FMDB与GCD
郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 因为FMD ...
- hdu4324 Triangle LOVE (拓扑排序)
这是一道最简单的拓扑排序题,好久没看这个算法了! 有点生疏了! 后附上百度的资料; #include<stdio.h> #include<string.h> int in[50 ...