Net Remoting 实现简易的控制台命令行聊天室
本套程序由四个主要的对象组成:
1. ChatRoom (ChatRoom.cs): 服务器端真正的提供远程服务的对象,负责以服务器推(push)的方式把 Sender 发来的消息"广播"出去。
/*
csc.exe ChatRoom.cs /t:library ChatRoom.dll
*/
using System;
using System.Runtime.Remoting;
[Serializable]
public class ChatRoom : MarshalByRefObject
{
//定义了 1 个名为 "ChatRoomEventHandler 的事件处理委托" 及其参数格式签名
public delegate void ChatRoomEventHandler(string s);
//定义了 3 个 "ChatRoomEventHandler 委托类型" 的事件及远程回调函数
public event ChatRoomEventHandler MessageReceive; //消息接收事件
public event ChatRoomEventHandler Login; //登录事件
public event ChatRoomEventHandler Logoff; //退出事件
public void OnMessageReceive(string Message)
{
if (MessageReceive != null)
{
//触发 Receiver 客户端 MessageReceive 事件,广播所有消息
MessageReceive(Message);
}
Console.WriteLine("Server: " + Message); //服务器消息监视
}
public void OnLogin(string User)
{
if (Login != null)
{
//触发 Receiver 客户端 Login 事件,广播 "登录" 消息
Login("System say: " + User + " Login!");
}
Console.WriteLine("Server: " + User + " Login!");
}
public void OnLogoff(string User)
{
if (Logoff != null)
{
//触发 Receiver 客户端 Logoff 事件,广播 "退出" 消息
Logoff("System say: " + User + " Logoff!");
}
Console.WriteLine("Server: " + User + " Logoff!");
}
public override object InitializeLifetimeService()
{
return null;
}
}
2. Server: 服务器。远程服务对象的宿主程序而已。
/*
csc.exe Server.cs
*/
using System;
using System.Runtime.Remoting;
class Server
{
public static void Main(string[] Args)
{
RemotingConfiguration.Configure("s.config");
Console.WriteLine("Server .... , Press Enter key to exit.");
Console.ReadLine();
}
}
下面是 Server 的配置文件 (s.config):
<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="Singleton" type="ChatRoom,ChatRoom" objectUri="ChatRoomURL" />
</service>
<channels>
<channel ref="http" port="8080">
<!-- 注意 设置反序列化级别 -->
<serverProviders>
<provider ref="wsdl" />
<formatter ref="soap" typeFilterLevel="Full" />
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>
<clientProviders>
<formatter ref="binary" />
</clientProviders>
<!-- 注意 设置反序列化级别 -->
</channel>
</channels>
</application>
</system.runtime.remoting>
</configuration>
3. Sender (Sender.cs): 客户端消息发送器对象,负责把"广播"的消息发送到远程服务对象。
/*
csc.exe /r:ChatRoom.dll Sender.cs
*/
using System;
using System.Timers;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
class Sender
{
ChatRoom x;
public static void Main(string[] Args)
{
Sender y = new Sender();
y.Run();
}
string User;
public void Run()
{
Console.WriteLine("Messages Sender ... ,Press 'q' to exit Chatting.");
//以配置方式获取远程服务对象实例
//RemotingConfiguration.Configure("c.config");
//x = new ChatRoom();
//以编程方式获取远程服务对象实例
System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(new System.Runtime.Remoting.Channels.Http.HttpChannel());
x = (ChatRoom) System.Activator.GetObject(typeof(ChatRoom),"http://server:8080/ChatRoomURL");
//先登录
Console.WriteLine("make a name then Login Please:");
User = Console.ReadLine();
//调用此远程方法,通知服务器触发 Receiver 客户端 Login 事件,广播 "登录" 消息
x.OnLogin(User);
Console.WriteLine("welcome " + User + ",Send your Message Please:");
string s; //存储键入的消息文字
while ((s=Console.ReadLine()) != "q") //如果键入 q 退出循环
{
//调用此远程方法,通知服务器触发 Receiver 客户端 MessageReceive 事件,广播你所键入的消息
x.OnMessageReceive(User + " say: " + s);
}
//调用此远程方法,通知服务器触发 Receiver 客户端 Logoff 事件,广播 "退出" 消息
x.OnLogoff(User);
Console.WriteLine("bye bye " + User);
}
}
4. Receiver (Receiver.cs): 客户端消息接收器对象,负责"自动"接收远程服务对象从 Sender 接收并转发"广播"的所有消息。
/*
csc.exe /r:ChatRoom.dll Receiver.cs
*/
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
//Receiver 对象必须要继承 MarshalByRefObject,由于相对于服务器, Receiver 对象 也要为其提供远程服务。
class Receiver : MarshalByRefObject
{
ChatRoom x;
public static void Main()
{
Receiver y = new Receiver();
y.Run();
}
public void Run()
{
RemotingConfiguration.Configure("c.config"); //相当于后期运行时绑定
x = new ChatRoom();
//向远程服务对象"注册"本地回调函数 this.Message_Receive1
x.MessageReceive += new ChatRoom.ChatRoomEventHandler(this.Message_Receive1);
//Login Logoff 与 MessageReceive 签名一样
x.Login += new ChatRoom.ChatRoomEventHandler(this.Message_Receive1);
x.Logoff += new ChatRoom.ChatRoomEventHandler(this.Message_Receive1);
Console.WriteLine("Messages Receiver ... ,Press Enter key to exit.");
Console.ReadLine(); //退出关闭接收器
//千万不要忘记结束时取消委托关系
x.MessageReceive -= new ChatRoom.ChatRoomEventHandler(this.Message_Receive1);
x.Login -= new ChatRoom.ChatRoomEventHandler(this.Message_Receive1);
x.Logoff -= new ChatRoom.ChatRoomEventHandler(this.Message_Receive1);
}
//这个就是被服务器端远程回调的函数
public void Message_Receive1(string s)
{
Console.WriteLine(s);//在本地显示接收的广播消息
}
public override object InitializeLifetimeService()
{
return null;
}
}
下面是 Sender 和 Receiver 的配置文件 (c.config):
<configuration>
<system.runtime.remoting>
<application>
<client>
<wellknown type="ChatRoom,ChatRoom" url="http://server:8080/ChatRoomURL" />
</client>
<channels>
<channel ref="http" port="0" />
</channels>
</application>
</system.runtime.remoting>
</configuration>
编译:
csc /t:library chatroom.cs
csc /r:chatroom.dll server.cs
csc /r:chatroom.dll sender.cs
csc /r:chatroom.dll receiver.cs
用法:
运行顺序:
1.先运行 服务器端:
Server.exe
2.再运行 客户端:
Sender.exe 用于登录、发消息、退出
Receiver.exe 仅用与接收并显示消息
注意: 不要通过关闭命令行控制台窗口退出程序!
Server.exe : Press "Enter" key to exit!
Sender.exe : Press "q" key to exit!
Receiver.exe : Press "Enter" key to exit!
相关推荐
这个"聊天室"项目是利用C# Remoting来创建一个客户端-服务器架构的应用,使得多个客户端能够与服务器进行实时通信,实现聊天功能。 首先,我们要理解.NET Remoting的基本概念。它是.NET框架提供的一种透明的远程...
总的来说,这个项目展示了.NET Remoting在实现跨进程通信和构建分布式应用中的强大能力,尤其是对于实时性要求高的聊天室应用,其事件驱动的通信模式和高效的网络通信能力显得尤为重要。通过深入研究这个项目,我们...
- `_NET下使用remoting技术实现的即时通信-聊天程序源代码源代码免费下载-Free Source Code for Instant Message-Chat using Remoting for LAN-Free Source Code.mht`:可能是源代码的Web档案文件,包含了详细的...
本文将详细探讨如何使用这三种技术实现一个简易聊天室。 首先,让我们从基础开始。Socket,也称为套接字,是网络编程中的基本概念,它是应用程序通过网络进行通信的接口。在TCP/IP协议栈中,Socket提供了进程间通信...
64位程序调用32位dll实现比较麻烦,花了很长时间去研究,网上有说通过程序外COM实现,但程序和代码都比较复杂,而且是C++代码,没一定功力不一定能理解,通过.netremoting的方式,把32位dll要实现的方法写在32位...
总的来说,Net Remoting为.NET开发者提供了强大的工具来实现服务端和客户端的双向通信。通过理解其核心概念,如接口定义、对象激活、通道选择以及安全性和性能优化,开发者可以构建健壮、高效的分布式系统。尽管现代...
.NET Remoting是微软.NET框架提供的一种高级通信机制,它允许不同应用程序域(AppDomain)间的对象互相调用方法,从而实现分布式系统中的组件交互。在这个场景下,我们讨论的是使用.NET Remoting技术来构建一个聊天...
它要求开发者理解C# Remoting的原理,能够处理网络异常,以及设计和实现一个可靠的聊天应用程序。通过这个项目,开发者不仅可以提升对C# Remoting的理解,还能增强在网络不稳定环境下的软件设计和调试能力。
学习remoting的一个测试,由服务端、客户端构成的一个简易局域网聊天室,均为winform,对C#初学者应该有点用。客户端使用udp查找服务端,通过remoting与服务端通信,服务端可对在线用户广播信息,客户端信息通过...
C# Remoting是.NET Framework提供的一种跨进程通信技术,它允许不同进程间的对象互相调用方法,实现分布式系统中的组件交互。在这个场景中,我们关注的是如何利用C# Remoting来实现在不同进程之间传递消息并进行互...
【标题】:“VS2008下使用WCF开发的简易聊天室” 在Visual Studio 2008(VS2008)中利用Windows Communication Foundation(WCF)开发聊天室是一项常见且实用的任务,这涉及到分布式系统和网络通信的核心技术。WCF...
C# NetRemoting实现双向通信 .Net Remoting 是由...C# NetRemoting实现双向通信的应用场景非常广泛,例如在线聊天室、游戏服务器、实时通信系统等。它可以实现类似QQ的互发消息的功能,提供了实时的双向通信功能。
在这个"利用Remoting技术+多线程做的聊天室"项目中,开发者构建了一个能够支持多用户同时在线交流的应用。Remoting在这里扮演了关键角色,它使客户端和服务器端可以交互消息,实现了远程对象的调用。服务器端创建一...
这个标题所指的项目是一个基于C#语言实现的即时通信或聊天程序,利用了.NET Remoting来构建客户端和服务端的通信基础设施。 即时通信(IM)程序的核心功能包括用户注册、登录、发送和接收消息,以及可能的群组聊天...
### 如何通过 .NET Remoting 实现双向通信 #### 一、引言 在分布式系统开发中,.NET Remoting 提供了一种高效且灵活的方式来处理远程对象的调用。与传统的请求/响应模型不同,.NET Remoting 支持更复杂的通信模式...
本项目“利用Remoting开发的简单聊天工具”是一个基于Visual Studio 2005(VS2005)的实例,展示了如何运用Remoting进行实时通信,实现基本的聊天功能。 首先,我们要理解Remoting的核心概念。Remoting允许对象在...
在这个“Remoting基本实现的一些代码样例程序.rar”压缩包中,我们可以期待找到一些关于如何使用Remoting进行C/S架构下网络通信的实例代码。 首先,Remoting的核心概念是透明远程过程调用(Transparent Remoting)...
这个“使用Remoting编写聊天程序”的主题,将深入讲解如何利用Remoting构建一个简单的实时聊天应用。 首先,理解Remoting的基础概念至关重要。Remoting允许.NET对象在进程内或进程间,甚至是跨计算机通信。它提供了...
《VB_NET Remoting 高级技术手册》是针对.NET Framework中的Remoting技术的一份详尽指南,主要关注在VB.NET环境下实现C/S(客户端/服务器)和B/S(浏览器/服务器)系统的分布式通信。Remoting是.NET框架提供的一种...