介绍

  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. python __getattr__和 __getattribute__

    __getattr__ 这个魔法函数会在类中查找不到属性时调用 class User: def __init__(self): self.info = 1 def __getattr__(self, ...

  2. JavPlayer:AI破坏马赛克,大量马赛克破坏版影片流出

    这是最近几个月业界讨论比较火的话题,发酵到现在, 终于可以给大家总结下最近的马赛克破坏版影片到底是怎么回事? 马赛克破坏版,简单讲就是利用AI技术,在打有马赛克影片的马赛克基础上进行修复操作, 来实现 ...

  3. PAT 1010 Radix 进制转换+二分法

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  4. Django路由系统的简介与使用

    Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL 与 为该URL调用的视图函数之间的映射表. ...

  5. 关于javascript中变量及函数的提升

    javascript中变量以及函数的提升,在我们平时的项目中其实还是挺常用的,尤其是大型项目中,不知不觉就会顺手添加一些变量,而有时候自己的不小心就会酿成一些不必要错误,趁有时间整理一下自己对于js中 ...

  6. OpenCV:图像的开运算与闭运算

    导包: import numpy as np import cv2 import matplotlib.pyplot as plt def show(image): plt.imshow(image) ...

  7. Android Service 启动流程

    执行顺序 : startService -> bindService -> unbindService -> stopService 回调的结果为: 执行顺序 : startServ ...

  8. 高级语言——java

    高级语言——java 起源与发展 1991 年,James Gosling 博士发布产品 Oak,这是 Java 语言的前身. 1995 年,Oak 语言改名为 Java. 1996 年,JDK(Ja ...

  9. RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍

    RDIFramework.NET,基于.NET的快速信息化系统敏捷开发.整合框架,给用户和开发者最佳的.Net框架部署方案. 1.RDIFramework.NET敏捷开发框架介绍 RDIFramewo ...

  10. 25个JavaScript数组方法代码示例

    摘要: 通过代码掌握数组方法. 原文:通过实现25个数组方法来理解及高效使用数组方法(长文,建议收藏) 译者:前端小智 Fundebug经授权转载,版权归原作者所有. 要在给定数组上使用方法,只需要通 ...