using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
namespace SocketServer
{
public class SocketHost
{
private IDictionary<Socket, byte[]> socketClientSesson = new Dictionary<Socket, byte[]>();
private List<string> message = new List<string>();
private Boolean isClear = true;
public int Port { get; set; }
public void Start()
{
Boardcast();
var socketThread = new Thread(() =>
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, this.Port);
//绑定到通道上
socket.Bind(iep);
//侦听
socket.Listen(6);
//通过异步来处理
socket.BeginAccept(new AsyncCallback(Accept), socket);
});
socketThread.Start();
Console.WriteLine("Server Started");
}
private void Accept(IAsyncResult ia)
{
Socket socket = ia.AsyncState as Socket;
var client = socket.EndAccept(ia);
socket.BeginAccept(new AsyncCallback(Accept), socket);
byte[] buf = new byte[1024];
this.socketClientSesson.Add(client, buf);
try
{
client.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), client);
string sessionId = client.RemoteEndPoint.ToString() + " - " + client.Handle.ToString();
Console.WriteLine("Client ({0}) Connected", sessionId);
}
catch (Exception ex)
{
Console.WriteLine("Error:\r\n" + ex.ToString());
}
}
private void Receive(IAsyncResult ia)
{
var client = ia.AsyncState as Socket;
if (client == null || !this.socketClientSesson.ContainsKey(client))
{
return;
}
int count = client.EndReceive(ia);
byte[] buf = this.socketClientSesson[client];
if (count > 0)
{
try
{
client.BeginReceive(buf, 0, buf.Length, SocketFlags.None, new AsyncCallback(Receive), client);
string context = Encoding.UTF8.GetString(buf, 0, count);
PushMessage(context);
}
catch (Exception ex)
{
Console.WriteLine("Receive Error :\r\n{0}", ex.ToString());
}
}
else
{
try
{
string sessionId = client.RemoteEndPoint.ToString() + " - " + client.Handle.ToString();
client.Disconnect(true);
this.socketClientSesson.Remove(client);
Console.WriteLine("Client ({0}) Disconnet", sessionId);
}
catch (Exception ex)
{
Console.WriteLine("Error: \r\n" + ex.ToString());
}
}
}
private void PushMessage(string context)
{
while (context.EndsWith("\n") || context.EndsWith("\0"))
{
context = context.Remove(context.Length - 1);
}
Console.WriteLine("Get : {0}", context);
message.Add(context);
isClear = false;
}
private void Boardcast()
{
var boardcaseThread = new Thread(() =>
{
while (true)
{
if (!isClear)
{
byte[] tmp = Encoding.UTF8.GetBytes(message[0] + "\0\n");
foreach (KeyValuePair<Socket, byte[]> node in this.socketClientSesson)
{
Socket client = node.Key;
client.Send(tmp, tmp.Length, SocketFlags.None);
}
message.RemoveAt(0);
isClear = message.Count > 0 ? false : true;
}
}
});
boardcaseThread.Start();
}
}
}
分享到:
相关推荐
C# Socket 通信,客户端服务器端, 源码,非常适合初学者
WinformSocket(C#作Socket服务器端)
一段C#编写的Socket服务器端程序,可以与前段AS3.0脚本连接,适合于初学C#网络通信的学者学习用。AS的脚本也在里面。good example!
C# Socket编程完成控制台服务器端和web客户端(调试通过)
包你用。 http://download.csdn.net/detail/ocean56/4108886这是客户端程序
这是我关于利用c#语言编写服务器端时所整理的一些笔记
C#编写 Socket服务器客户端
C# Socket Udp 通信服务器端(控制台应用程序),不可多的的Udp资料。本地端口10000
使用C#语言编写的Socket通信客户端和服务端应用程序,实现客户端和服务端的网络通信。
在开发一个聊天室程序时,我们可以使用Socket、Remoting、WCF这些具有双向通信的协议或框架。而现在,我正要实现一个C#语言作为服务器端、Android作为客户端的聊天室。由于服务器端和客户端不是同一语言(C#和java),...
C#基于socket通讯服务器端,简单的服务器端
C# SuperSocket框架 ---服务器端源程序,源程序包里有一个TCP测试工具,可以方便你进行测试,同时还附有测试成功的截图。
广播数据包程序,采用c#编写,大家可以参考一下,希望有帮助
C# Socket 与服务器Socket交互 客户端
使用c#编写基于socket通信的远程控制源码,对于想学习通信相关同学帮助很大
C# Socket Udp 通信服务器端,一个封装好的Windows 服务,端口是10000
C#高并发SOCKET服务器和客户端完整工程实例源码,工程现场测试使用的源码,适合新手及有一定经验开发人员
利用C# Socket 实现HTTP WEB服务器 VS2008 + WINDOWS7 调试测试通过
关于C#编写的服务器端接收文件的一些问题