zoukankan
html css js c++ java
封装的一个套接字服务端
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Net.Sockets;
using
System.Threading;
namespace
EarlyServer
{
public
class
ConnectClient : IDisposable
{
Member
#region
Member
private
Socket m_Socket;
private
string
m_NetWorkName;
private
Thread m_Thread;
private
bool
disposed
=
false
;
private
bool
m_IsRuning
=
false
;
public
event
CommandReceiveEventHandler CommandReceived;
#endregion
public
ConnectClient(Socket socket,
string
netWorkName)
{
m_Socket
=
socket;
m_NetWorkName
=
netWorkName;
}
Public Methods
#region
Public Methods
public
void
Start()
{
m_Socket
=
new
Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
m_Thread
=
new
Thread(
new
ThreadStart(ThreadFunction));
m_Thread.IsBackground
=
true
;
m_Thread.Start();
}
#endregion
Private Methods
#region
Private Methods
private
void
ThreadFunction()
{
m_IsRuning
=
true
;
while
(m_IsRuning)
{
byte
[] byteMessage
=
null
; ;
string
tmpStr
=
string
.Empty;
while
(ServiceStartFlag)
{
try
{
if
(m_Socket.Connected)
{
byteMessage
=
new
byte
[
1000
];
int
len
=
m_Socket.Receive(byteMessage);
if
(len
>
0
)
{
tmpStr
=
Encoding.UTF8.GetString(byteMessage);
if
(tmpStr.Length
>
0
)
{
string
[] ary
=
tmpStr.Split(
'
|
'
);
if
(ary.Length
>
3
)
{
//
命令|发送者|目标|内容
MsgCommand cmd
=
new
MsgCommand(ary[
0
], ary[
1
], ary[
2
], tmpStr.Replace(ary[
0
]
+
"
|
"
+
ary[
1
]
+
"
|
"
+
ary[
2
]
+
"
|
"
,
""
));
this
.OnCommandReceived(
this
,
new
CommandEventArgs(cmd));
}
}
}
}
}
catch
(SocketException ex)
{
m_IsRuning
=
true
;
ClientData.List.Remove(m_NetWorkName);
}
}
}
}
#endregion
event Methods
#region
event Methods
private
void
OnCommandReceived(
object
sender, CommandEventArgs e)
{
if
(CommandReceived
!=
null
)
{
CommandReceived(
this
, e);
}
}
#endregion
IDisposable 成员
#region
IDisposable 成员
public
void
Dispose()
{
Dispose(
true
);
GC.SuppressFinalize(
this
);
}
protected
virtual
void
Dispose(
bool
disposing)
{
if
(
!
this
.disposed)
{
this
.Close();
//
注意这里不是线程安全的
}
disposed
=
true
;
}
public
void
Close()
{
if
(disposed)
{
m_IsRuning
=
false
;
m_Thread.Abort();
}
MsgCommand cmd
=
new
MsgCommand(CommandType.Outing,
this
.m_ServerIPAddress,
this
.m_NetWorkName);
this
.SendToServer(cmd);
this
.m_Socket.Close();
this
.m_NetworkStream.Close();
}
~
ConnectClient()
{
Dispose(
false
);
}
#endregion
}
public
class
ClientData
{
public
static
Dictionary
<
string
, ConnectClient
>
List
=
new
Dictionary
<
string
, ConnectClient
>
();
}
public
delegate
void
CommandReceiveEventHandler(
object
sender, CommandEventArgs eventArgs);
public
class
CommandEventArgs : EventArgs
{
private
MsgCommand m_MsgCommand;
public
MsgCommand Command
{
get
{
return
m_MsgCommand; }
}
public
CommandEventArgs(MsgCommand msgCommand)
{
this
.m_MsgCommand
=
msgCommand;
}
}
public
class
MsgCommand
{
private
string
commnadString;
/**/
///
<summary>
///
发送者名称
///
</summary>
public
string
CommnadString
{
get
{
return
commnadString; }
set
{ commnadString
=
value; }
}
private
string
senderName;
/**/
///
<summary>
///
发送者名称
///
</summary>
public
string
SenderName
{
get
{
return
senderName; }
set
{ senderName
=
value; }
}
private
string
targetName;
/**/
///
<summary>
///
目标名称
///
</summary>
public
string
TargetName
{
get
{
return
targetName; }
set
{ targetName
=
value; }
}
private
string
commandBody;
/**/
///
<summary>
///
内容
///
</summary>
public
string
MetaData
{
get
{
return
commandBody; }
set
{ commandBody
=
value; }
}
Constructors
#region
Constructors
public
MsgCommand(
string
commnadstring,
string
sendername,
string
targetName,
string
metaData)
{
this
.commnadString
=
commnadstring;
this
.senderName
=
sendername;
this
.commandBody
=
metaData;
this
.targetName
=
targetName;
}
#endregion
}
}
查看全文
相关阅读:
Arduino 封装库
Arduino 学习
Linux和UNIX监控
mysql语句:批量更新多条记录的不同值[转]
datagridview设置currentrow为指定的某一行[转]
WeifenLuo组件中如何设置停靠窗体的宽度
Win7 64位 Visio反向工程(MySQL)
Castle.ActiveRecord (V3.0.0.130)
位运算(2)——Number of 1 Bits
位运算(1)——Hamming Distance
原文地址:https://www.cnblogs.com/skyblue/p/1525892.html
最新文章
5、Hadoop 2.6.5 环境搭建
4、MapReduce思想、运行机制
3、HDFS架构和YARN架构
2、Hadoop 2.X 概述及生态系统
【shell】2、判断表达式、if语句
【shell】1、变量的声明、引用及作用域
开放API接口安全处理
Base64编码原理
7、基本命令-Crontab定时调度
6、基本命令-防火墙
热门文章
Magento事件机制
Laravel_Elixir_gulp任务利器安装
核心概念 —— 契约(Contracts)
核心概念 —— 门面(Facades)
核心概念 —— 服务提供者
核心概念 —— 服务容器
PHP面向对象:类型提示
PHP中的Trait
HTTP层 —— Session
HTTP层 —— 验证
Copyright © 2011-2022 走看看