C#以太网Sockets服务器设计实现
作者:cfqq1989 发布时间:2023-10-10 04:38:32
标签:C#,以太网,Sockets
【1】引用命名空间:
//System.Net.Sockets
using System.Net.Sockets; // 以太网对象
// 字段位置
private Socket socket业务; //对象既可以当服务器,又可以当客户端
TcpListener tcpListener; //服务器对象
TcpClient tcpClient; //客户端对象
Socket 构造函数:
public Socket(SocketInformation 套接字结构体);
public Socket(SocketType 插座类型, ProtocolType 协议类型);
public Socket(AddressFamily 工作组, SocketType 插座类型, ProtocolType 协议类型);
参数介绍:
AddressFamily.InterNetwork=2 用 IPv4
public enum AddressFamily
{
Unknown = -1, //未知的地址族。
Unspecified = 0, //未指定的地址族。
Unix = 1, //Unix 本地到主机地址。
InterNetwork = 2, //IP 版本 4 的地址。
ImpLink = 3, //ARPANET IMP 地址。
Pup = 4, //PUP 协议的地址。
Chaos = 5, //MIT CHAOS 协议的地址。
NS = 6, //IPX 或 SPX 地址。
Ipx = 6, //Xerox NS 协议的地址。
Iso = 7, //ISO 协议的地址。
Osi = 7, //OSI 协议的地址。
Ecma = 8, //欧洲计算机制造商协会 (ECMA) 地址。
DataKit = 9, //Datakit 协议的地址。
Ccitt = 10, //CCITT 协议(如 X.25)的地址。
Sna = 11, //IBM SNA 地址。
DecNet = 12, //DECnet 地址。
DataLink = 13, //直接数据链接接口地址。
Lat = 14, //LAT 地址。
HyperChannel = 0xF, //NSC Hyperchannel 地址。
AppleTalk = 0x10, //AppleTalk 地址。苹果
NetBios = 17, //NetBios 地址。
VoiceView = 18, //VoiceView 地址。
FireFox = 19, //FireFox 地址。
Banyan = 21, //Banyan 地址。
Atm = 22, //本机 ATM 服务地址。
InterNetworkV6 = 23,//IP 版本 6 的地址。
Cluster = 24, //Microsoft 群集产品的地址。
Ieee12844 = 25, //IEEE 1284.4 工作组地址。
Irda = 26, //IrDA 地址。
NetworkDesigners = 28,//支持网络设计器 OSI 网关的协议的地址。
Max = 29 //MAX 地址。
}
SocketType.Stream
public enum SocketType
{
Stream = 1,// Tcp InterNetwork 地址族 //支持可靠、双向
Dgram = 2, // Udp InterNetwork 地址族。
Raw = 3,
Rdm = 4,
Seqpacket = 5,
Unknown = -1//指定未知的 Socket 类型。
}
ProtocolType.Tcp
public enum ProtocolType
{
IP = 0,
IPv6HopByHopOptions = 0,
Icmp = 1,
Igmp = 2,
Ggp = 3,
IPv4 = 4,
Tcp = 6,
Pup = 12,
Udp = 17,
Idp = 22,
IPv6 = 41,
IPv6RoutingHeader = 43,
IPv6FragmentHeader = 44,
IPSecEncapsulatingSecurityPayload = 50,
IPSecAuthenticationHeader = 51,
IcmpV6 = 58,
IPv6NoNextHeader = 59,
IPv6DestinationOptions = 60,
ND = 77,
Raw = 0xFF,
Unspecified = 0,
Ipx = 1000,
Spx = 1256,
SpxII = 1257,
Unknown = -1
}
【2】字段: 声明对象
//声明一个Socket对象
private Socket socketSever服务器; // 【1】Socket
// 工作组,套接字类型,协议类型
socketSever服务器 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
【3】初始化:参数
//设置 服务器ip
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.0.7"), int.Parse(12345));
try
{
socketSever服务器.Bind(ipe);// 【2】Bind 绑定本地ip
}
catch (Exception ex)
{
//写入日志
MessageBox.Show("服务器开启失败:"+ex.Message);
return;
}
// 调用listen()函数监听,业务窗口(同时办理业务窗口数)// 同时占线数量
socketSever服务器.Listen(10);// 【3】Listen
Task.Run(new Action(() => //开线程,使主线程能退到ui层
{
客户登录业务(); // 【4】Accpet
}));
按钮_启动服务.Enabled = false;
private void 客户登录业务()
{
while (true)
{
//等待客户
Socket socketClient客户 = socketSever服务器.Accept();// 【4】Accpet
//客户来了
string client客户IP地址 = socketClient客户.RemoteEndPoint.ToString();
客户电话簿.Add(client客户IP地址, socketClient客户);
占线刷新(client客户IP地址, true);
Task.Run(new Action(() => //第2队线程
{
Receive客户经理(socketClient客户);
}));
}
}
private void Receive客户经理(Socket socketClient)
{
while (true)
{
// 创建一个缓冲区
byte[] buffer = new byte[1024 * 1024 * 10];
int length = -1;
// 客户ip
string client = socketClient.RemoteEndPoint.ToString();
// 等待客户发言
try
{
length = socketClient.Receive(buffer);
}
catch (Exception)
{
// 下线了
占线刷新(client, false);
客户电话簿.Remove(client);
break;
}
if (length > 0)
{// 委托呼叫
wt(client,Encoding.UFT8.GetString(buffer,0,length));
}
else
{
// 下线了
占线刷新(client, false);
客户电话簿.Remove(client);
break;
}
}
}
使用以太网
注意:对象不包含0个参数
来源:https://blog.csdn.net/cfqq1989/article/details/121724912


猜你喜欢
- 代码中已经加入了注释,需要的朋友可以直接参考代码中的注释。下面直接上功能实现的主要代码:import java.io.File;import
- 在Spring中有一个类CachingUserDetailsService实现了UserDetailsService接口,该类使用静态代理模
- java 出现Zipexception 异常的解决办法1 异常描述在从 SVN 检出项目并配置完成后,启动 Tomcat 服务器,报出如下错
- 一、前言最近在加强 ITAEM 团队的一个 app 项目——学生教师学习交流平台人员组成:安卓 + 前端 + 后台后台 DAO 层借鉴了华工
- 废话不多说,直接上代码package com.ietree.basicskill.socket.basic.nio;import java.
- 本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值。分享给大家供大家参考之用。具体分析如下:一
- 从主线程发送消息到子线程(准确地说应该是非UI线程)package com.zhuozhuo;import android.app.Acti
- 前言Java8新特性java.time.*包学习。 自从java发布模式变更就发现自己有些跟不上他们的速度,java8还有不少没有用透而9、
- 定义:简单绑定是将一个用户界面元素(控件)的属性绑定到一个类型(对象)实例上的某个属性的方法。基本类型、包装类型、数组(以参数a
- 1、profiles是什么?有什么作用在maven构建的项目都存在一个pom.xml的项目对象模型配置文件,用于约束项目(如:jar包管理、
- 我们编程的过程中大部分使用了很出色的ORM框架,例如:MyBatis,Hibernate,SpringJDBC,但是这些都离不开数据驱动JD
- 引言在项目中,时间的使用必不可少,而java 8之前的时间api Date和Calander等在使用上存在着很多问题,于是,jdk1.8引进
- Flutter Sizedbox 是一个 布局组件,用来给 child 添加 tight 约束的,也可以用来添加空白。width,heigh
- 😎 先看效果一人分饰多角(bushi)😏 后端代码🍗 先引入websocket依赖<!-- websocket消息推送 -->&
- 示例1项目结构代码controller中 UserController.javapackage com.example.demo1110.c
- C#接口的学习,在编程中,我们经常会用到接口,那什么是接口呢?接口描述的是可属于任何类或结构的一组相关功能,所以实现接口的类或结构必须实现接
- 1 起因在实际业务开发中, 我们经常会遇到需要临时创建一个数组的情况, 今天我们就来讲一下Java中ArrayList初始化的方法2 解决方
- The java.io.Writer.flush() method flushes the stream. If the stream ha
- 简单理解泛型泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。通俗点将就是“类型的变量
- 前言在Web应用开发过程中,一般都涵盖一些常用功能的实现,如数据库访问、异常处理、消息队列、缓存服务、OSS服务,以及接口日志配置,接口文档