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();
}
}
}
分享到:
相关推荐
4. **例程**:这些例程展示了如何使用封装后的Socket类进行实际的网络通信,可能涵盖了TCP连接、UDP广播、文件传输等多种应用场景。 5. **异常处理**:良好的封装会考虑到各种可能出现的网络异常,如连接中断、超时...
【C#编写的聊天室】是一种使用C#编程语言开发的多用户实时交流平台,它基于C# 2005版本实现。C#(读作"C Sharp")是微软公司推出的面向对象的编程语言,它以其简洁、类型安全和性能高效而受到广大开发者喜爱。在2005...
在C#中,我们可以使用System.Net命名空间下的Socket类来创建TCP/IP连接,实现客户端和服务器端的通信。 1. **客户端程序实现**: - 创建Socket实例,指定协议类型(如TCP)和远程服务器的IP地址和端口号。 - 使用...
在这个项目中,C#用于编写服务器端的业务逻辑和界面展示。 2. **网络编程**: - **Socket编程**:在C#中,Socket类是进行网络通信的基础,用于建立客户端和服务器之间的连接。ChatServer可能使用TcpListener监听...
8. **多线程和并发**:在服务器端,为了处理多个客户端的并发连接,通常会创建多个线程或者使用异步回调。C#中的ThreadPool是一个理想的工具,可以有效地管理和调度工作线程。 9. **安全性**:考虑到网络安全,C#的...
服务器端负责监听客户端的连接请求,并管理多个客户端的连接,当接收到客户端的消息时,广播到所有已连接的客户端。客户端则用于向服务器发送消息,并接收其他客户端发送的消息。C#中的System.Net.Sockets命名空间...
本项目"基于C#的简单局域网通信"是一个很好的起点,它展示了如何使用Socket类创建一个简单的聊天应用程序,涵盖了客户端和服务器端的实现。 首先,让我们了解一下Socket。Socket是网络通信的基本单元,可以理解为两...
总的来说,"用C#编写单线程聊天室"是一个基础的网络编程实践,可以帮助开发者熟悉Socket类以及基本的网络通信流程。然而,实际的聊天应用会面临并发连接、安全性、性能优化等问题,需要更复杂的设计和编程技巧来解决...
通过这个项目,你可以了解如何使用C#编写服务器和客户端程序,如何建立和维护Socket连接,以及如何在多线程环境下管理并发操作,这些都是在网络应用开发中不可或缺的知识点。同时,通过阅读和分析代码,你还能提升你...
本文将深入探讨如何使用C#语言来实现一个基于Socket的聊天程序,这将涉及到网络编程的基础概念、C#的Socket类以及如何构建一个简单的聊天服务器。 首先,我们需要理解什么是Socket。Socket,也称为网络套接字,是...
C#提供了丰富的类库,使得Socket编程变得相对简单,我们可以利用这些类库创建客户端和服务器端,从而进行实时的数据交换。 首先,我们要理解Socket的基本概念。Socket是网络通信中的一个抽象层,它是两台机器间通信...
在C#中,我们可以使用System.Net.Sockets命名空间下的UdpClient类来实现UDP通信。以下是一些关键知识点: 1. **创建UDP服务器**: - 实例化UdpClient对象,指定监听的IP地址和端口号。 - 使用BeginReceive方法...
本项目“C#语言编写的聊天室”正是利用C#的强大功能,结合Visual Studio 2010这一高效开发环境,构建了一套完整的聊天室系统,包括服务器端和客户端,旨在满足基本的实时通信需求。 1. **C#语言基础**:C#是微软...
服务器端主要负责接收和广播玩家的动作,维护游戏状态,并处理聊天消息。可以使用C#的TCP或UDP套接字编程来建立服务器,处理客户端的连接请求,实现数据传输。 总结来说,"C#编写的对对碰游戏"项目是一个结合了C#...
【C#编写简单聊天工具】这篇文档主要介绍了如何使用C#进行基于Socket的网络编程,以构建一个简单的聊天工具。作者旨在巩固自身网络编程知识并为初学者提供指导。文章结构分为四大部分:程序的分析与设计、C#网络编程...
服务器端会用Socket的Accept方法监听和接受客户端的连接。数据的发送和接收则通过Socket的Send和Receive方法完成。 3. **异步套接字**:在标签中提到了“异步套接字”,这是C# Socket编程中提高性能的重要方式。...
在本项目中,"用C#编写的一个小型聊天室"是一个基于C#编程语言实现的简单网络通信应用,主要用于提供实时的在线对话功能。通过这个聊天室,用户可以进行文字交流,同时系统能够统计在线人数并展示当前在线的成员。...
开发者需要遵循这些规则来编写客户端和服务器端的代码,以便它们能够有效地交换数据。 客户端(**Client**)部分可能包含以下组件: 1. 用户界面:用于输入和显示聊天内容的界面。 2. Socket连接:使用C#的Socket类...