【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个参数