C# Stocket
2019-06-22 20:31
381 查看
介绍
1、TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
2、UDP(User Data Protocol,用户数据包协议)是与TCP相对应的协议。它属于TCP/IP协议族中的一种。
3、应用层(Application):应用层是一个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议,也有许多的企业商业应用和互联网应用。
4、传输层(Transport):传输层包括UDP和TCP,UDP几乎不对报文进行检查,而TCP提供传输保证。
5、网络层(NetWork):网络层协议由一系列协议组成,包括ICMP、IGMP、RIP、OSPF、IP(v4、v6)等。
6、链路层(Link):又称为物理数据网络接口层,负责报文传输。
网络4层协议
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading; namespace socket网络编程 { public partial class frmServer : Form { public frmServer() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } private void BtnStart_Click(object sender, EventArgs e) { try { //Socket服务器端 //引入命名空间:using System.Net; //引入命名空间:using System.Net.Sockets; //1、创建Socket Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //第一个参数:设置网络寻址协议;第二个参数:设置数据传输方式;第三个参数:设置通信协议 //2、绑定IP和端口 this.txtLog.Text = "创建服务端Socket对象\r\n"+this.txtLog.Text; IPAddress ip = IPAddress.Parse(txtIp.Text.Trim()); //IP地址 int port = Convert.ToInt32(txtPort.Text.Trim()); //端口 IPEndPoint ipEndpoint = new IPEndPoint(ip, port); serverSocket.Bind(ipEndpoint); //3、开启侦听 serverSocket.Listen(10); //挂起连接队列的最大长度。 //4、开始接收客户端连接 this.txtLog.Text = "开启接受客户端连接\r\n" + this.txtLog.Text; ThreadPool.QueueUserWorkItem(new WaitCallback(this.StartAcceptClient), serverSocket); } catch (Exception ex) { throw ex; } } List<Socket> ClientProxSocket = new List<Socket>(); public void StartAcceptClient(object state) { try { var serverSocket = (Socket)state; while (true) { Socket proxSocket = serverSocket.Accept(); //为新建连接创建新的Socket对象 this.txtLog.Text = string.Format("客户端:{0}已连接\r\n{1}", proxSocket.RemoteEndPoint.ToString(), this.txtLog.Text); //proxSocket.RemoteEndPoint:获取连接信息 ClientProxSocket.Add(proxSocket); //服务端接受客户端的消息 ThreadPool.QueueUserWorkItem(new WaitCallback(RecieveData),proxSocket); //string str = DateTime.Now.ToString(); //byte[] data = Encoding.UTF8.GetBytes(str); //待发送字节数组 //proxSocket.Send(data, 0, data.Length, SocketFlags.None); //发送消息,发送的消息必须大于0个字节 //proxSocket.Shutdown(SocketShutdown.Both); //this.txtLog.Text = "关闭\r\n" + this.txtLog.Text; //proxSocket.Close(); //关闭 } } catch (Exception ex) { throw ex; } } public void RecieveData(object obj) { var proxSocket = (Socket)obj; byte[] data = new byte[1024 * 1024]; //方法返回值,实际接受的数据的长度(字节数) while (true) { try //处理客户端异常退出 { int reallen = proxSocket.Receive(data, 0, data.Length, SocketFlags.None); if (reallen == 0) { this.txtLog.Text = string.Format("客户端:{0}退出\r\n{1}", proxSocket.RemoteEndPoint.ToString(), this.txtLog.Text); //客户端退出 proxSocket.Shutdown(SocketShutdown.Both); proxSocket.Close(); ClientProxSocket.Remove(proxSocket); return; } string formClientMsg = Encoding.UTF8.GetString(data, 0, reallen); this.txtLog.Text = string.Format("接受客户端{0}的消息:{1}\r\n{2}", proxSocket.RemoteEndPoint.ToString(), formClientMsg, this.txtLog.Text); } catch (Exception ex) { } } } private void BtnSend_Click(object sender, EventArgs e) { try { foreach (var socket in ClientProxSocket) { if (socket.Connected) { string str = this.txtMsg.Text.Trim(); byte[] data = Encoding.UTF8.GetBytes(str); socket.Send(data, 0, data.Length, SocketFlags.None); } } } catch (Exception ex) { throw ex; } } } }View Code
相关文章推荐
- 在C#6.0中的新语言特性
- C#中timer类的用法
- C#中NULL,"",DBNULL,String.Empty,Convert.IsDBNull()的区别
- windows API与C#的数据类型对应关系表
- 【C#设计模式-代理模式】
- C# 调用C++ SDK/API的问题总结
- C#操作Access数据库
- 在C#应用中使用Common Logging日志接口
- C# 输入法
- HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等
- C# 字符分割与出现次数统计
- C#中跨线程访问控件问题解决方案
- C#学习笔记Day3
- C# winform动态画条形统计图
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十四)制作主角属性面板及加点器
- C#导入Excel报错问题3。
- C# 窗体实例化一次
- LeetCode Online Judge 题目C# 练习 - Binary Tree Inorder Traversal
- C#产生不重复的随机数
- C#单例模式的三种写法(转)