`
wsql
  • 浏览: 12103434 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Net Remoting 实现简易的控制台命令行聊天室

阅读更多
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!


相关文章
Net Remoting 实现简易的"命令行控制台"聊天室 选择自 playyuer 的 Blog
show() and showDialog()
Linux下C语言编程--基础知识
Linux 系统命令精通指南(初级)
commandText语句基本用法,+号和“”号的作用
分享到:
评论

相关推荐

    C# remoting 聊天室

    这个"聊天室"项目是利用C# Remoting来创建一个客户端-服务器架构的应用,使得多个客户端能够与服务器进行实时通信,实现聊天功能。 首先,我们要理解.NET Remoting的基本概念。它是.NET框架提供的一种透明的远程...

    基于.NET Remoting的局域网聊天室

    总的来说,这个项目展示了.NET Remoting在实现跨进程通信和构建分布式应用中的强大能力,尤其是对于实时性要求高的聊天室应用,其事件驱动的通信模式和高效的网络通信能力显得尤为重要。通过深入研究这个项目,我们...

    NET使用remoting技术实现的即时通信聊天程序源代码

    - `_NET下使用remoting技术实现的即时通信-聊天程序源代码源代码免费下载-Free Source Code for Instant Message-Chat using Remoting for LAN-Free Source Code.mht`:可能是源代码的Web档案文件,包含了详细的...

    简易聊天室UDP、Socket、Remoting三种方式实现

    本文将详细探讨如何使用这三种技术实现一个简易聊天室。 首先,让我们从基础开始。Socket,也称为套接字,是网络编程中的基本概念,它是应用程序通过网络进行通信的接口。在TCP/IP协议栈中,Socket提供了进程间通信...

    C#通过.NetRemoting方式实现64位程序调用32位dll

    64位程序调用32位dll实现比较麻烦,花了很长时间去研究,网上有说通过程序外COM实现,但程序和代码都比较复杂,而且是C++代码,没一定功力不一定能理解,通过.netremoting的方式,把32位dll要实现的方法写在32位...

    Net Remoting实现简单的服务端客户端双向通信

    总的来说,Net Remoting为.NET开发者提供了强大的工具来实现服务端和客户端的双向通信。通过理解其核心概念,如接口定义、对象激活、通道选择以及安全性和性能优化,开发者可以构建健壮、高效的分布式系统。尽管现代...

    NET remoting技术实现聊天程序源代码

    .NET Remoting是微软.NET框架提供的一种高级通信机制,它允许不同应用程序域(AppDomain)间的对象互相调用方法,从而实现分布式系统中的组件交互。在这个场景下,我们讨论的是使用.NET Remoting技术来构建一个聊天...

    C# Remoting 断网事件处理+聊天系统

    它要求开发者理解C# Remoting的原理,能够处理网络异常,以及设计和实现一个可靠的聊天应用程序。通过这个项目,开发者不仅可以提升对C# Remoting的理解,还能增强在网络不稳定环境下的软件设计和调试能力。

    C# 利用remoting制作局域网简单聊天室

    学习remoting的一个测试,由服务端、客户端构成的一个简易局域网聊天室,均为winform,对C#初学者应该有点用。客户端使用udp查找服务端,通过remoting与服务端通信,服务端可对在线用户广播信息,客户端信息通过...

    c# Remoting 实现进程间互相调用 并传递消息

    C# Remoting是.NET Framework提供的一种跨进程通信技术,它允许不同进程间的对象互相调用方法,实现分布式系统中的组件交互。在这个场景中,我们关注的是如何利用C# Remoting来实现在不同进程之间传递消息并进行互...

    VS2008下使用WCF开发的简易聊天室

    【标题】:“VS2008下使用WCF开发的简易聊天室” 在Visual Studio 2008(VS2008)中利用Windows Communication Foundation(WCF)开发聊天室是一项常见且实用的任务,这涉及到分布式系统和网络通信的核心技术。WCF...

    C# NetRemoting实现双向通信

    C# NetRemoting实现双向通信 .Net Remoting 是由...C# NetRemoting实现双向通信的应用场景非常广泛,例如在线聊天室、游戏服务器、实时通信系统等。它可以实现类似QQ的互发消息的功能,提供了实时的双向通信功能。

    利用Remoting技术+多线程做的聊天室

    在这个"利用Remoting技术+多线程做的聊天室"项目中,开发者构建了一个能够支持多用户同时在线交流的应用。Remoting在这里扮演了关键角色,它使客户端和服务器端可以交互消息,实现了远程对象的调用。服务器端创建一...

    .NET下使用remoting技术实现的即时通信/聊天程序源代码

    这个标题所指的项目是一个基于C#语言实现的即时通信或聊天程序,利用了.NET Remoting来构建客户端和服务端的通信基础设施。 即时通信(IM)程序的核心功能包括用户注册、登录、发送和接收消息,以及可能的群组聊天...

    如何通过Remoting实现双向通信

    ### 如何通过 .NET Remoting 实现双向通信 #### 一、引言 在分布式系统开发中,.NET Remoting 提供了一种高效且灵活的方式来处理远程对象的调用。与传统的请求/响应模型不同,.NET Remoting 支持更复杂的通信模式...

    利用Remoting开发的简单聊天工具

    本项目“利用Remoting开发的简单聊天工具”是一个基于Visual Studio 2005(VS2005)的实例,展示了如何运用Remoting进行实时通信,实现基本的聊天功能。 首先,我们要理解Remoting的核心概念。Remoting允许对象在...

    Remoting基本实现的一些代码样例程序.rar

    在这个“Remoting基本实现的一些代码样例程序.rar”压缩包中,我们可以期待找到一些关于如何使用Remoting进行C/S架构下网络通信的实例代码。 首先,Remoting的核心概念是透明远程过程调用(Transparent Remoting)...

    使用Remoting编写聊天程序

    这个“使用Remoting编写聊天程序”的主题,将深入讲解如何利用Remoting构建一个简单的实时聊天应用。 首先,理解Remoting的基础概念至关重要。Remoting允许.NET对象在进程内或进程间,甚至是跨计算机通信。它提供了...

    VB_NET Remoting 高级技术手册

    《VB_NET Remoting 高级技术手册》是针对.NET Framework中的Remoting技术的一份详尽指南,主要关注在VB.NET环境下实现C/S(客户端/服务器)和B/S(浏览器/服务器)系统的分布式通信。Remoting是.NET框架提供的一种...

Global site tag (gtag.js) - Google Analytics