`

C#使用SOCKET编程实现服务器+客户端的聊天程序示例(转)

    博客分类:
  • C#
阅读更多



1 C#使用SOCKET编程实现服务器+客户端的聊天程序示例
[日期:2009-12-28] 来源:     作者: [字体:大 中 小]


本文使用SOCKET编程实现聊天程序,不基于P2P技术。

首先,本文主要是针对那些刚接触SOCKET编程的朋友,将介绍的是一个服务器端+客户端的聊天系统,比较简单,入门级别的,先来看下效果界面.
上面是服务器端运行界面;下面把客户端界面贴给大家看下:

功能看起来是比较简单。服务器的端口号可以在“系统菜单”里面的参数配置进行修改的。

下面开始讲下如何实现上面聊天的功能吧。直接上代码:

服务端代码如下:


C# Code [http://www.oeedu.com]


1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Text;
  7 using System.Windows.Forms;
  8
  9 using System.Net;
10 using System.Net.Sockets;
11 using System.Threading;
12 using System.Xml;
13
14 namespace Server
15 {
16     public partial class ServerMain : Form
17     {
18         public ServerMain()
19         {
20             InitializeComponent();
21         }
22
23         private void ServerMain_Load(object sender, EventArgs e)
24         {
25             this.CmdStar.Enabled = true;
26             this.CmdStop.Enabled = false;
27         }
28
29         private void 配置参数ToolStripMenuItem_Click(object sender, EventArgs e)
30         {
31             Set TSet = new Set();
32             TSet.ShowDialog();
33         }
34
35         private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
36         {
37             About TAbout = new About();
38             TAbout.Show();
39         }
40         /// <summary>
41         /// 获得XML文件中的端口号
42         /// </summary>
43         /// <returns></returns>
44         private int GetPort()
45         {
46             try
47             {
48                 XmlDocument TDoc = new XmlDocument();
49                 TDoc.Load("Settings.xml");
50                 string TPort = TDoc.GetElementsByTagName("ServerPort")[0].InnerXml;
51                 return Convert.ToInt32(TPort);
52
53             }
54             catch { return 6600; }//默认是6600
55         }
56
57         //声明将要用到的类
58         private IPEndPoint ServerInfo;//存放服务器的IP和端口信息
59         private Socket ServerSocket;//服务端运行的SOCKET
60         private Thread ServerThread;//服务端运行的线程
61         private Socket[] ClientSocket;//为客户端建立的SOCKET连接
62         private int ClientNumb;//存放客户端数量
63         private byte[] MsgBuffer;//存放消息数据
64
65         private void CmdStar_Click(object sender, EventArgs e)
66         {
67             ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
68             ServerInfo=new IPEndPoint(IPAddress.Any,this.GetPort());
69             ServerSocket.Bind(ServerInfo);//将SOCKET接口和IP端口绑定
70             ServerSocket.Listen(10);//开始监听,并且挂起数为10
71
72             ClientSocket = new Socket[65535];//为客户端提供连接个数
73             MsgBuffer = new byte[65535];//消息数据大小
74             ClientNumb = 0;//数量从0开始统计
75
76             ServerThread = new Thread(RecieveAccept);//将接受客户端连接的方法委托给线程
77             ServerThread.Start();//线程开始运行
78
79             CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
80
81             this.CmdStar.Enabled = false;
82             this.CmdStop.Enabled = true;
83             this.StateMsg.Text = "服务正在运行" "  运行端口:" this.GetPort().ToString();
84             this.ClientList.Items.Add("服务于 "   DateTime.Now.ToString()   " 开始运行.");
85         }
86        
87         //接受客户端连接的方法
88         private void RecieveAccept()
89         {
90             while (true)
91             {
92                 ClientSocket[ClientNumb] = ServerSocket.Accept();
93                 ClientSocket[ClientNumb].BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack),ClientSocket[ClientNumb]);
94                 this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString() " 成功连接服务器.");
95                 ClientNumb  ;
96             }
97         }
98
99         //回发数据给客户端
100         private void RecieveCallBack(IAsyncResult AR)
101         {
102             try
103             {
104                 Socket RSocket = (Socket)AR.AsyncState;
105                 int REnd = RSocket.EndReceive(AR);
106                 for (int i = 0; i < ClientNumb; i  )
107                 {
108                     if (ClientSocket[i].Connected)
109                     {
110                         ClientSocket[i].Send(MsgBuffer, 0, REnd,0);
111                     }
112                     RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket);
113
114                 }
115             }
116             catch { }
117
118         }
119
120         private void CmdStop_Click(object sender, EventArgs e)
121         {
122             ServerThread.Abort();//线程终止
123             ServerSocket.Close();//关闭SOCKET
124
125             this.CmdStar.Enabled = true;
126             this.CmdStop.Enabled = false;
127             this.StateMsg.Text = "等待运行";
128             this.ClientList.Items.Add("服务于 "   DateTime.Now.ToString()   " 停止运行.");
129         }
130
131
132
133     }
134 }



好,看完服务端代码,接下我们来看下客户端的代码又是如何实现的?



客户端代码:


C# Code [http://www.oeedu.com]


1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Text;
  7 using System.Windows.Forms;
  8
  9 using System.Net;
10 using System.Net.Sockets;
11
12 namespace Client
13 {
14     public partial class ClientMain : Form
15     {
16         public ClientMain()
17         {
18             InitializeComponent();
19         }
20
21         private IPEndPoint ServerInfo;
22         private Socket ClientSocket;
23         private Byte[] MsgBuffer;
24         private Byte[] MsgSend;
25
26         private void ClientMain_Load(object sender, EventArgs e)
27         {
28             this.CmdSend.Enabled = false;
29             this.CmdExit.Enabled = false;
30
31             ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
32             MsgBuffer = new Byte[65535];
33             MsgSend = new Byte[65535];
34             CheckForIllegalCrossThreadCalls = false;
35
36             Random TRand=new Random();
37             this.UserName.Text = "用户"   TRand.Next(10000).ToString();
38         }
39
40         private void CmdEnter_Click(object sender, EventArgs e)
41         {
42             ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(this.ServerPort.Text));
43
44             try
45             {
46                 ClientSocket.Connect(ServerInfo);
47
48                 ClientSocket.Send(Encoding.Unicode.GetBytes("用户: "   this.UserName.Text   " 进入系统!\n"));
49
50                 ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
51
52                 this.SysMsg.Text  = "登录服务器成功!\n";
53                 this.CmdSend.Enabled = true;
54                 this.CmdEnter.Enabled = false;
55                 this.CmdExit.Enabled = true;
56             }
57             catch
58             {
59                 MessageBox.Show("登录服务器失败,请确认服务器是否正常工作!");
60             }
61         }
62
63         private void ReceiveCallBack(IAsyncResult AR)
64         {
65             try
66             {
67                 int REnd = ClientSocket.EndReceive(AR);
68                 this.RecieveMsg.AppendText(Encoding.Unicode.GetString(MsgBuffer, 0, REnd));
69                 ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
70
71             }
72             catch
73             {
74                 MessageBox.Show("已经与服务器断开连接!");
75                 this.Close();
76             }
77
78         }
79
80         private void CmdSend_Click(object sender, EventArgs e)
81         {
82             MsgSend = Encoding.Unicode.GetBytes(this.UserName.Text   "说:\n"   this.SendMsg.Text   "\n");
83             if (ClientSocket.Connected)
84             {
85                 ClientSocket.Send(MsgSend);
86                 this.SendMsg.Text = "";
87             }
88             else
89             {
90                 MessageBox.Show("当前与服务器断开连接,无法发送信息!");
91             }
92         }
93
94         private void CmdExit_Click(object sender, EventArgs e)
95         {
96             if (ClientSocket.Connected)
97             {
98                 ClientSocket.Send(Encoding.Unicode.GetBytes(this.UserName.Text   "离开了房间!\n"));
99                 ClientSocket.Shutdown(SocketShutdown.Both);
100                 ClientSocket.Disconnect(false);
101             }
102             ClientSocket.Close();
103
104             this.CmdSend.Enabled = false;
105             this.CmdEnter.Enabled = true;
106             this.CmdExit.Enabled = false;
107         }
108
109         private void RecieveMsg_TextChanged(object sender, EventArgs e)
110         {
111             this.RecieveMsg.ScrollToCaret();
112         }
113
114         private void SendMsg_KeyDown(object sender, KeyEventArgs e)
115         {
116             if (e.Control && e.KeyValue == 13)
117             {
118                 e.Handled = true;
119                 this.CmdSend_Click(this, null);
120             }
121         }
122
123
124
125
126     }
127 }



我只对服务器端的代码做了注释,客户端就没有写注释了,因为代码是差不多的。区别在于客户端不需要监听,也不需要启用线程进行委托。
关于 ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
这句代码,我想给初学者解释一下,这里“AddressFamily.InterNetwork”表示的是使用IPV4地址,“SocketType.Stream”表示使用的是流格式(另外还有数据包格式和原始套接字格式),“ProtocolType.Tcp”表示使用TCP协议(另外还有很多其它协议,例如大家常看到的UDP协议)。
另外关于SOCKET类中的BeginReceive方法,请大家参考MSDN,里面有详细说明。

下面是Settings.xml内容


XML Code [http://www.oeedu.com]


<?xml version="1.0" encoding="utf-8" ?>
<Server>
  <ServerPort>6600</ServerPort>
</Server>



本文代码下载地址:
  • 大小: 38.9 KB
  • 大小: 60 KB
分享到:
评论

相关推荐

    C#下如何实现服务器+客户端的聊天程序 (doc)

    在C#中实现服务器与客户端的聊天程序是一个基础的网络编程任务,主要涉及到Socket编程、多线程以及用户界面的设计。以下将详细讲解这个过程。 首先,了解Socket的基础概念至关重要。Socket是网络通信的一种接口,它...

    服务器+客户端的聊天程序(C#)

    在IT领域,网络通信是不可或缺的一部分,而"服务器+客户端的聊天程序(C#)"就是一个典型的网络编程示例。本教程将深入探讨如何使用C#语言和SOCKET技术构建这样一个聊天系统,让两个或多个用户通过互联网进行实时通信...

    C#SuperSocket---客户端源程序

    文件列表中的"SocketServer(C#SuperSocket服务器的简易实现)---客户端源程序",暗示了这个压缩包不仅包含了一个简单的SuperSocket服务器实现,还包含了与之配合使用的客户端源代码。客户端源程序通常会包含一个或...

    c# WinForm 使用Socket实现简单实现服务端与客户端连接,实现消息发送,服务器客户端重连

    本示例中,我们探讨的是如何利用C#的WinForm来创建一个基于Socket的服务端和客户端,实现两者之间的消息传递,以及在服务器断线后的重连机制。 首先,Socket在C#中是System.Net.Sockets命名空间下的类,它提供了TCP...

    C# socket实现服务器客户端通信

    这个项目提供了一个基础的示例,帮助学习者理解服务器客户端通信的基本原理和C#中的实现方式。在实际开发中,我们还需要考虑安全、性能优化和异常处理等多个方面,以确保应用的稳定性和健壮性。

    C#高并发SOCKET服务器和客户端完整工程实例源码.zip

    本示例源码提供了C#语言实现的高并发SOCKET服务器和客户端的完整工程实例,这为开发者提供了学习和实践网络通信机制的机会。C#作为一种强大的.NET平台语言,拥有丰富的库支持,使得构建这样的系统变得相对简单。 ...

    C#使用SuperSocket实现自定义协议实现CS架构服务器和客户端程序设计).zip

    在本项目中,"C#使用SuperSocket实现自定义协议实现CS架构服务器和客户端程序设计"),开发者利用C#编程语言以及SuperSocket开源库构建了一套C/S(客户端/服务器)架构的应用。SuperSocket是一个轻量级、高度可扩展的...

    C#编写socket做服务器和客户端例子

    本篇将深入讲解如何使用C#编写Socket服务器和客户端,以及相关的关键知识点。 一、Socket简介 Socket是网络通信的基础接口,它允许应用程序通过Internet进行通信。在C#中,System.Net.Sockets命名空间提供了Socket...

    C# Socket 通信,客户端服务器端

    本教程将深入讲解C#中的Socket通信,包括客户端和服务器端的实现,以及如何通过源码学习相关知识。 首先,我们要理解Socket的基本概念。Socket,也称为套接字,是网络通信中的一个接口,它允许应用程序通过网络发送...

    C#版Socket通信含服务端、客户端、WebSocket,代码完整清晰

    Socket通信在IT行业中是网络编程的基础,特别是在C#开发中,它被广泛用于构建服务器和客户端应用程序,实现数据的高效传输。本项目包含了一个完整的C#版Socket通信示例,涵盖了服务端、客户端以及WebSocket的实现,...

    C# Socket简单例子(服务器与客户端通信)

    本示例主要介绍了如何使用C#的Socket类进行基本的服务器与客户端通信。 首先,让我们深入理解Socket。Socket是网络通信的基本组件,它代表了网络上两个应用程序间的通信端点。在C#中,Socket类位于System.Net....

    C#+SOCKET实例(含有客户端和服务器端)源码

    在IT行业中,网络编程是构建分布式系统和互联网应用程序的关键部分,而C#语言结合Socket编程则为开发者提供了强大的工具来实现这一点。本实例中的"C#+SOCKET实例(含有客户端和服务器端)源码"旨在帮助开发者理解如何...

    C# Socket 客户端和服务器

    在IT行业中,网络通信是不可或缺的一部分,而C#语言提供了强大的Socket编程能力,使得开发者能够构建可靠的TCP客户端和服务器应用程序。本篇文章将深入探讨C# Socket客户端和服务器的实现细节,以及如何处理多个...

    c#tcp服务器+客户端(心跳).zip

    本示例涉及的是使用C#编程语言实现的TCP服务器和客户端,它们具有心跳机制以确保连接的稳定性和可靠性。Unity是一个广泛用于游戏开发的跨平台引擎,它支持C#脚本,因此这个项目可能是为Unity游戏或应用程序设计的...

    socket linux c & windows c# windows客户端,服务器程序和linux下客户端,服务器程序。一共四个经典程序并有详细的注释。细细的阅读,一定会有收获。

    在本资源中,包含了Linux C语言和Windows C#平台下的服务器和客户端程序,覆盖了TCP协议的实现。接下来,我们将深入探讨这些知识点。 1. **Socket接口**: Socket是操作系统提供的一个接口,它允许应用程序通过...

    C#利用socket实现的一对一聊天工具源代码

    C# 是一种广泛用于开发Windows应用程序和网络应用的语言,其中Socket编程是实现网络通信的核心部分。Socket,也被称作套接字,是进程间通信(IPC)的一种方式,尤其适用于跨网络的通信。在C#中,我们可以使用System...

    c#简易聊天室(服务器端+客户端)

    在本文中,我们将深入探讨如何使用C#编程语言构建一个简易聊天室,涵盖服务器端和客户端的实现。这个聊天室项目实现了即时通讯的基本功能,包括登录、退出、发送系统消息、公共通讯以及私密对话。我们将围绕以下几个...

    C# socket通信的服务器和客户端

    在IT领域,网络通信是不可或缺的一部分,而Socket编程则是实现跨网络通信的一种基本技术。本文将深入探讨如何在C#环境中使用Socket进行服务器和客户端的通信。C#提供了丰富的类库,使得Socket编程变得相对简单,我们...

    C#SuperSocket服务端与客户端通信实例

    本教程将深入探讨如何使用C#编程语言以及SuperSocket库来构建一个高效、稳定的服务器端和客户端通信模型。SuperSocket是一个轻量级且易于使用的.NET Socket服务端开发框架,它为开发者提供了构建自定义网络应用的...

    c#socket编程实现聊天程序

    本文将深入探讨如何使用C#语言来实现一个基于Socket的聊天程序,这将涉及到网络编程的基础概念、C#的Socket类以及如何构建一个简单的聊天服务器。 首先,我们需要理解什么是Socket。Socket,也称为网络套接字,是...

Global site tag (gtag.js) - Google Analytics