介绍

  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层协议

原理图

端口的分类

  1、公认端口(Well Known Ports):从0到1023,它们紧密绑定(binding)于一些服务。通常这些端口的通讯,明确了某种服务的协议。例如:80端口实际上总是HTTP通讯。

  2、注册端口(Registered Ports):从1024到49151。它们松散地绑定于一些服务。也就是说许多服务绑定于这些端口,这些端口同样用于许多其他目的。例如:许多系统处理动态端口从1024左右开始。

  3、动态和私有端口(Dynamic and/or Private Ports):从49152到65535。理论上,不应为服务分配这些端口。实际上,机器通常从1024起分配动态端口,但也有例外:SUN的RPC端口从32768开始。

服务端界面

 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(); //挂起连接队列的最大长度。
//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[ * ];
//方法返回值,实际接受的数据的长度(字节数)
while (true)
{
try //处理客户端异常退出
{
int reallen = proxSocket.Receive(data, , data.Length, SocketFlags.None);
if (reallen == )
{
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, , 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, , data.Length, SocketFlags.None);
}
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}

C# Stocket的更多相关文章

  1. java-通讯stocket插件mina实例

    mina是对nio的具体实现.是目前比较高效和流行的nio(非阻塞式I/O)框架 mina主要包括: 其中服务端为:NioSocketAcceptor 客户端为:NioSocketConnector ...

  2. 走进netty

    三月份开始看公司RPC框架的源码,发现如果要折腾明白,网络通讯这块知识必不可少.于是从如下几点开始逐步研究. 一.基础知识篇 1.Unix下5种I/O模型 Linux的内核将所有外部设备都看作一个文件 ...

  3. Nginx-rtmp 直播媒体实时流实现

    0. 前言 这段时间在搭建一个IPCamera项目服务器.视频点对点通话,客户端会查看设备端的音视频实时流.为了省流量,是通过P2P进行穿透.但是由于NAT设备的原因和IPV4的枯竭.有些设备是无法进 ...

  4. Linux应用程序设计之网络基础编程

    1.TCP/IP协议概述 1.1.OSI参考模型及TCP/IP参考模型 OSI协议参考模型是基于国际标准化组织(ISO)的建议发展起来的,从上到下工分为7层:应用层,表示层,会话层,传输层,网络层,数 ...

  5. SCWS中文分词PHP扩展详细安装说明

    因最近写的一段代码,需要用到中文分词,在网上找了一下,发现了scws这个不错的插件,故根据文档安装使用,下面记录下安装的全过程 系统:centos 安装scws wget http://www.xun ...

  6. CPU占用高系统反应慢之问题定位

    今天在看到公司群里有关于测试反应测试服务器比较卡,调用调用超时,响应很慢,成功率低的问题,然后想着去处理这个问题. 本着开发的精神,摒弃网管的水平,寻找问题的根源. 主要从如下几个方面入手: 1:查询 ...

  7. django 本地项目部署uwsgi 以及云服务器部署 uwsgi+Nginx+Docker+MySQL主从

    一 .django 本地项目部署uwsgi 1 本地部署项目 uwsgi安装测试 通过uwsgi 进行简单部署 安装uwsgi命令:pip install uwsgi -i http://pypi.d ...

随机推荐

  1. opencv---(腐蚀、膨胀、边缘检测、轮廓检索、凸包、多边形拟合)

    一.腐蚀(Erode) 取符合模板的点, 用区域最小值代替中心位置值(锚点) 作用: 平滑对象边缘.弱化对象之间的连接. opencv 中相关函数:(erode) // C++ /** shape: ...

  2. javascript中的定时器入门

    JavaScript提供定时器(timer)的功能,可以延期执行或重复执行函数或代码段. window对象提供了三个方法来实现定时器的效果,分别是setTimeout().setInternal()和 ...

  3. Java中间消息件——ActiveMQ入门级运用

    先来说一说我们为什么要用这个东西啊! 比如,我们现在有这样了个问题要解决: 这样,我们就要用到中间消息间了 然后我们就说一下什么是中间消息间吧. 采用消息传送机制/消息队列 的中间件技术,进行数据交流 ...

  4. Java工程师学习指南

    java学习指南-四个部分:分别是入门篇,初级篇,中级篇,高级篇 第一步是打好Java基础,掌握Java核心技术,                                            ...

  5. JS基础语法---编程思想和对象

    编程思想: 把一些生活中做事的经验融入到程序中 面向过程:凡事都要亲力亲为,每件事的具体过程都要知道,注重的是过程 面向对象:根据需求找对象,所有的事都用对象来做,注重的是结果 面向对象特性: 封装, ...

  6. Android 查看项目依赖树的四种方式

    Android 查看项目依赖树的四种方式: 方式一: ./gradlew 模块名:dependencies //查看单独模块的依赖 ./gradlew :app:dependencies --conf ...

  7. Postsql 修改字段长度和类型

    以后更改字段长度会重写表,如果表比较大,那么表会加锁,需要很长时间 通过一种方法通过修改pg_attribute.atttypmod字段修改长度,不需要重写表 查询select * from pg_a ...

  8. WPF datagrid 列按钮使用

    原文:WPF中使用DataGrid时操作列按钮问题     <DataGrid x:Name="datagrid" AutoGenerateColumns="Fal ...

  9. LInux:服务的管理-systemctl

    使用systemctl管理服务 服务的启动与停止 服务的启动与停止 命令格式:systemctl 选项 服务名 选项说明: start:启动;stop:停止:restart:重启:status:服务状 ...

  10. idea延长使用期

    0. 如果你的idea(版本2019.02)是已过期状态则先上网找个激活码激活再进行下面步骤延长使用期至2089年 1. 附件下载地址: 链接:https://pan.baidu.com/s/1L5O ...