介绍

  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;
}
}
}
}

最新文章

  1. 【译】Spring 4 + Hibernate 4 + Mysql + Maven集成例子(注解 + XML)
  2. Yii2 事务操作
  3. 2013 duilib入门简明教程 -- 部分bug 2 (14)
  4. string.Join()的用法
  5. AIDL学习
  6. Backbone小记录
  7. 4.关于phpstudy for linux 的安装(LNMP)更好的环境请看8.LNMP环境
  8. linux下的僵尸进程处理SIGCHLD信号
  9. linux 用户空间获得纳秒级时间ns
  10. linux下安装php的oracle拓展
  11. Eclipse中将含有图片资源的项目打包成jar文件
  12. zzuli--2134: 维克兹的进制转换(规律)
  13. linux下FTP服务器搭建教程1
  14. java字符串以及字符类型基础
  15. neo4j-rest-client使用摘要
  16. Java相关面试题总结+答案(二)
  17. Codeforces Round #539 (Div. 2) - C. Sasha and a Bit of Relax(思维题)
  18. netty(七) Handler的执行顺序
  19. 正确重写hashcode hashcode与equals方法 集合元素如何判断是否相等 集合如何查看是否包含某个元素
  20. 三元运算&amp;匿名函数lambda

热门文章

  1. RocketMQ(一):推拉消费模型客户端实践
  2. Go 自定义类型来实现枚举类型限制
  3. 首个企业架构TOGAF角色扮演案例培训的诞生
  4. JS-字符串截取方法slice、substring、substr的区别
  5. 在vue组件中设置定时器和清除定时器
  6. ArcGIS api for JavaScript 3.27 FindTask查询功能
  7. 如何制作gif图片?教你把gif图片缩小100倍大小的妙招!
  8. tomcat7控制台日志中文乱码
  9. NTP and Chrony在RHEL
  10. Codeforces Global Round 5