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
}
}
查看全文
相关阅读:
ping和traceroute原理分析异同为什么不能ping通却能traceroute (转载) 规格严格
JDBC hang on Statement 规格严格
邮件服务返回代码含义 规格严格
后台分析(转载) 规格严格
Java Socket(转载) 规格严格
编程好习惯 规格严格
统计图表生成 规格严格
几篇不错的博客 规格严格
我见过的一个让我瞠目结舌的电脑高手!
Ubuntu 下Ape转Mp3[88250原创]
原文地址:https://www.cnblogs.com/skyblue/p/1525892.html
最新文章
firebug sourcecode
防火防盗防师兄
开始KDE3.5.2
HTML5新特性:范围样式
Git 历险记(三)——创建一个自己的本地仓库
Windows Phone开发(19):三维透视效果
Windows Phone开发(18):变形金刚第九季——变换
Git历险记(一)
百度开发者大会《用HTML5新特性开发移动App》PPT分享
代码的加载地址与运行地址
热门文章
Windows Phone开发(20):当MediaElement和VideoBrush合作的时候
Git历险记(二)——Git的安装和配置
Git历险记(四)——索引与提交的幕后故事
微信公众平台宣布增加接口IP白名单提高安全性
TP5与TP3.X对比
B/S架构与C/S架构的区别
Cannot declare class app\home\controller\Cases because the name is already in use
动态查询:getBy字段名
在来几篇博客 规格严格
日志审计产品(转载) 规格严格
Copyright © 2011-2022 走看看