介绍

  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. Mac PyCharm2019激活码

    此教程支持最新2019.2版本Pycharm及其他软件 此教程实时更新,请放心使用:如果有新版本出现猪哥都会第一时间尝试激活: pycharm官网下载地址:http://www.jetbrains.c ...

  2. Java入门系列之集合LinkedList源码分析(九)

    前言 上一节我们手写实现了单链表和双链表,本节我们来看看源码是如何实现的并且对比手动实现有哪些可优化的地方. LinkedList源码分析 通过上一节我们对双链表原理的讲解,同时我们对照如下图也可知道 ...

  3. NumPy实现数据的聚合,计算最大值,最小值

    1.数组值的求和 首先构造一个具有100个值的数组,然后我们利用两个不同的方法进行求和: >>> l=np.random.random() l的数据如下: >>> ...

  4. 【JDBC】CRUD操作

    JDBC的CRUD操作 向数据库中保存记录 修改数据库中的记录 删除数据库中的记录 查询数据库中的记录 保存代码的实现 package demo1; import java.sql.Connectio ...

  5. 【Nginx】安装&环境配置

    安装依赖包 安装make:yum -y install gcc automake autoconf libtool make 安装g++:yum -y install gcc gcc-c++ 安装pc ...

  6. 读数笔记_python网络编程3(4)

    4.套接字名与DNS 讨论网络地址,描述将主机名解析为原始IP地址的分布式服务 4.1. 主机名与socket 浏览器汇总一般键入域名.有些域名标识整个机构.如,python.org,而另一些指定了主 ...

  7. linux服务器下oracle开机自启动设置

    1.首先切换到Oracle用户 [oracle@oracletest ~]$ cd /u01/app/oracle/product/11.2.0/db_1/bin/       -----标红字体部分 ...

  8. 在没有备份的情况下重新创建丢失的数据文件 (Doc ID 1149946.1)

    Recreating a missing datafile with no backups (Doc ID 1149946.1) APPLIES TO: Oracle Database - Enter ...

  9. Script - 检查当前的undo配置和建议设置 (Doc ID 1579035.1)

    Script - Check Current Undo Configuration and Advise Recommended Setup (Doc ID 1579035.1) APPLIES TO ...

  10. MVC(基础一)

    MVC学习之前必须掌握的c#基础知识 一.类自动属性 public class Person { //自动属性 public string Name { get; set; } private int ...