110,536
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
namespace Wodsoft.Net.Sockets
{
public class TCPListenerClient : IDictionary<string, object>
{
internal TCPListenerClient(TCPListener listener, Socket socket)
{
this.socket = socket;
this.listener = listener;
data = new Dictionary<string, object>();
this["RemoteEndPoint"] = socket.RemoteEndPoint;
}
internal Socket socket;
private TCPListener listener;
public void Send(byte[] data)
{
listener.Send(this, data);
}
#region 字典
private Dictionary<string, object> data;
public void Add(string key, object value)
{
data.Add(key.ToLower(), value);
}
public bool ContainsKey(string key)
{
return data.ContainsKey(key.ToLower());
}
public ICollection<string> Keys
{
get { return data.Keys; }
}
public bool Remove(string key)
{
return data.Remove(key.ToLower());
}
public bool TryGetValue(string key, out object value)
{
return data.TryGetValue(key.ToLower(), out value);
}
public ICollection<object> Values
{
get { return data.Values; }
}
public object this[string key]
{
get
{
if (ContainsKey(key))
return data[key.ToLower()];
return null;
}
set
{
if (ContainsKey(key))
data[key.ToLower()] = null;
else
Add(key, value);
}
}
public void Add(KeyValuePair<string, object> item)
{
data.Add(item.Key.ToLower(), item.Value);
}
public void Clear()
{
data.Clear();
}
public bool Contains(KeyValuePair<string, object> item)
{
return this[item.Key] == item.Value ? true : false;
}
public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
{
data.ToArray().CopyTo(array, arrayIndex);
}
public int Count
{
get { return data.Count; }
}
public bool IsReadOnly
{
get { return false; }
}
public bool Remove(KeyValuePair<string, object> item)
{
if (this[item.Key] != item.Value)
return false;
return Remove(item.Key);
}
public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
{
return data.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return data.GetEnumerator();
}
#endregion
}
}
listener = new TCPListener();
listener.Port = 5000;
listener.ListenCount = 65536;
listener.ReceiveBufferSize = 65536;
listener.SendBufferSize += 65536;
listener.AcceptCompleted += Accepted;
listener.DisconnectCompleted += Disconnect;
listener.ReceiveCompleted += Received;
listener.SendCompleted += Sent;
listener.Start();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace Wodsoft.Net.Sockets
{
public class TCPListener : IEnumerable<TCPListenerClient>
{
private Socket socket;
private HashSet<TCPListenerClient> clients;
/// <summary>
/// 实例化TCP监听者。
/// </summary>
public TCPListener()
{
ReceiveBufferSize = 65536;
SendBufferSize = 65536;
clients = new HashSet<TCPListenerClient>();
started = false;
}
/// <summary>
/// 接收缓存大小。
/// </summary>
public int ReceiveBufferSize { get; set; }
/// <summary>
/// 发送缓存大小。
/// </summary>
public int SendBufferSize { get; set; }
/// <summary>
/// 监听数量。
/// </summary>
public int ListenCount { get; set; }
private int port;
/// <summary>
/// 监听端口。
/// </summary>
public int Port
{
get { return port; }
set
{
if (value < 0 || value > 65535)
throw new ArgumentOutOfRangeException(port + "不是有效端口。");
port = value;
}
}
private bool started;
/// <summary>
/// 开始服务。
/// </summary>
public void Start()
{
if (started)
throw new InvalidOperationException("已经开始服务。");
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Any, Port));
socket.Listen(ListenCount);
socket.SendBufferSize = SendBufferSize;
socket.ReceiveBufferSize = ReceiveBufferSize;
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.Completed += Accepted;
socket.AcceptAsync(e);
started = true;
}
/// <summary>
/// 停止服务。
/// </summary>
public void Stop()
{
if (!started)
throw new InvalidOperationException("没有开始服务。");
foreach (TCPListenerClient client in clients)
Disconnect(client);
socket.Close();
socket = null;
started = false;
}
/// <summary>
/// 接收完成时引发事件。
/// </summary>
public event EventHandler<SocketAsyncEventArgs> ReceiveCompleted;
/// <summary>
/// 接受客户完成时引发事件。
/// </summary>
public event EventHandler<SocketAsyncEventArgs> AcceptCompleted;
/// <summary>
/// 客户断开完成时引发事件。
/// </summary>
public event EventHandler<SocketAsyncEventArgs> DisconnectCompleted;
/// <summary>
/// 发送完成时引发事件。
/// </summary>
public event EventHandler<SocketAsyncEventArgs> SendCompleted;
private void Accepted(object sender, SocketAsyncEventArgs e)
{
TCPListenerClient client = new TCPListenerClient(this, e.AcceptSocket);
clients.Add(client);
e.Completed -= Accepted;
e.Completed += Received;
e.SetBuffer(new byte[ReceiveBufferSize], 0, ReceiveBufferSize);
e.AcceptSocket.ReceiveAsync(e);
SocketAsyncEventArgs ee = new SocketAsyncEventArgs();
ee.Completed += Accepted;
socket.AcceptAsync(ee);
if (AcceptCompleted != null)
{
AcceptCompleted(client, e);
}
}
private void Sent(object sender, SocketAsyncEventArgs e)
{
TCPListenerClient client = clients.SingleOrDefault(c => c.socket == e.AcceptSocket);
if (client == null)
return;
if (SendCompleted != null)
{
SendCompleted(client, e);
}
e.Dispose();
}
private void Received(object sender, SocketAsyncEventArgs e)
{
TCPListenerClient client = clients.SingleOrDefault(c => c.socket == e.AcceptSocket);
if (client == null)
return;
if (e.BytesTransferred == 0)
{
e.AcceptSocket.Close();
clients.Remove(client);
if (DisconnectCompleted != null)
{
DisconnectCompleted(client, e);
}
e.Dispose();
return;
}
SocketAsyncEventArgs s = new SocketAsyncEventArgs();
s.AcceptSocket = client.socket;
s.Completed += Received;
s.SetBuffer(new byte[ReceiveBufferSize], 0, ReceiveBufferSize);
client.socket.ReceiveAsync(s);
if (ReceiveCompleted != null)
{
ReceiveCompleted(client, e);
}
e.Dispose();
}
private void Disconnected(object sender, SocketAsyncEventArgs e)
{
TCPListenerClient client = clients.SingleOrDefault(c => c.socket == e.AcceptSocket);
if (client == null)
return;
e.AcceptSocket.Close();
clients.Remove(client);
if (DisconnectCompleted != null)
{
DisconnectCompleted(client, e);
}
e.Dispose();
}
/// <summary>
/// 发送数据。
/// </summary>
/// <param name="client">客户端。</param>
/// <param name="data">要发送的数据。</param>
public void Send(TCPListenerClient client, byte[] data)
{
if (!started)
throw new InvalidOperationException("没有开始服务。");
if (!client.socket.Connected)
{
client.socket.Close();
clients.Remove(client);
if (DisconnectCompleted != null)
{
DisconnectCompleted(client, null);
}
return;
}
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.AcceptSocket = client.socket;
e.SetBuffer(data, 0, data.Length);
e.Completed += Sent;
client.socket.SendAsync(e);
}
/// <summary>
/// 给所有已连接的客户端发送数据。
/// </summary>
/// <param name="data">要发送的数据。</param>
public void Send(byte[] data)
{
if (!started)
throw new InvalidOperationException("没有开始服务。");
foreach (TCPListenerClient client in clients)
{
if (!client.socket.Connected)
{
client.socket.Close();
clients.Remove(client);
if (DisconnectCompleted != null)
{
DisconnectCompleted(client, null);
}
return;
}
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.AcceptSocket = client.socket;
e.SetBuffer(data, 0, data.Length);
e.Completed += Sent;
client.socket.SendAsync(e);
}
}
/// <summary>
/// 断开客户端连接。
/// </summary>
/// <param name="client">要断开的客户端。</param>
public void Disconnect(TCPListenerClient client)
{
if (!started)
throw new InvalidOperationException("没有开始服务。");
SocketAsyncEventArgs e = new SocketAsyncEventArgs();
e.AcceptSocket = client.socket;
e.Completed += Disconnected;
client.socket.DisconnectAsync(e);
}
/// <summary>
/// 获取客户端泛型。
/// </summary>
/// <returns></returns>
public IEnumerator<TCPListenerClient> GetEnumerator()
{
return clients.GetEnumerator();
}
/// <summary>
/// 获取客户端泛型。
/// </summary>
/// <returns></returns>
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return clients.GetEnumerator();
}
}
}
class Threadtcpserver
{
public static ArrayList mmm = new ArrayList();
public static ArrayList clientArray = new ArrayList();
private Socket server; //创建服务器套接字server
public Threadtcpserver()
{
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //设置套接字的类型,不必深究,大体知道就可以
IPAddress ipadd = IPAddress.Parse("127.0.0.1"); //绑定到我的电脑的IP
IPEndPoint ipe = new IPEndPoint(ipadd, 6688); //绑定到端口,推荐设置为1024以后的空闲端口
server.Bind(ipe); //绑定到端口
server.Listen(20); //server套接字实现监听
Console.WriteLine("Wait for the client to build Connection.....");
while (true)
{ //得到包含客户端信息的套接字
Socket client = server.Accept(); //阻塞方法
clientArray.Add(client);
ClientThread newclient = new ClientThread(client); //创建了ClientThread类的实例
Thread newthread = new Thread(new ThreadStart(newclient.ClientServer));
//新建线程,并将ClientThread类的实例的方法赋给线程
newthread.Start(); //启动线程
}
}
}//class Threadtcpserver
class ClientThread
{
public static int connection = 0; // 统计连接到服务器端的客户端数
public Socket server;
int i;
public ClientThread(Socket ClientSocket)
{
this.server = ClientSocket;
}
public void ClientServer()
{
string data = null;
byte[] bytes = new byte[12048]; // 服务器端设置缓冲区
if (server != null)
{
Threadtcpserver.mmm.Add(server.RemoteEndPoint);
connection++; //有新的连接
Console.WriteLine("A new client get connected!" + server.RemoteEndPoint.ToString());
}
Console.WriteLine("There are {0} clients get connections!", connection);
try
{
while ((i = server.Receive(bytes)) != 0) // 当服务器端的缓冲区内接受到的信息不为空时
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine(data + DateTime.Now.ToString());
Console.WriteLine("这是客户端发来的信息");
DateIn(server.ToString(), data);
data = data.ToUpper();
byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
server.Send(msg);
// SenddMsg(0, msg);
Console.WriteLine("The sended data:{0}", data);
}
server.Close(); //如果客户端退出了,则连接数减少
connection--;
Console.WriteLine("Client connection declined!", connection);
}
catch
{
server.Close(); //如果客户端退出了,则连接数减少
connection--;
Console.WriteLine("Client connection declined!", connection);
}
}
}//class ClientThread
class Program
{
static void Main(string[] args)
{
Threadtcpserver instance = new Threadtcpserver();
//创建 Threadtcpserver 的实例,同时运行程序
}
}
System.Threading.Thread th = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(SendDesk));
th.Start(desksoc);
void SendDesk(object mysoc)
{
try
{
((Socket)mysoc).Send(lb.ToArray());
}
catch { }
}