- 浏览: 786817 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (417)
- ASP.NET MVC (18)
- WEB基础 (24)
- 数据库 (69)
- iPhone (20)
- JQuery (3)
- Android (21)
- UML (8)
- C# (32)
- 移动技术 (19)
- 条码/RFID (6)
- MAC (8)
- VSS/SVN (6)
- 开卷有益 (4)
- 应用软件 (1)
- 软件工程 (1)
- java/Eclipse/tomcat (61)
- 英语学习 (2)
- 综合 (16)
- SharePoint (7)
- linux (42)
- Solaris/Unix (38)
- weblogic (12)
- c/c++ (42)
- 云 (1)
- sqlite (1)
- FTp (2)
- 项目管理 (2)
- webservice (1)
- apache (4)
- javascript (3)
- Spring/Struts/Mybatis/Hibernate (4)
- 航空业务 (1)
- 测试 (6)
- BPM (1)
最新评论
-
dashengkeji:
1a64f39292ebf4b4bed41d9d6b21ee7 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
zi_wu_xian:
PageOffice操作excel也可以设置表格的行高列宽,并 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
wanggang0321:
亲,我在pptx(office2007以上版本)转pdf的时候 ...
JODConverter]word转pdf心得分享(转) -
xiejanee:
楼主:你好!我想请问下 你在代码中用DOMDocument* ...
Xerces-C++学习之——查询修改XML文档 (转)
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>
本文代码下载地址:
发表评论
-
invoke
2013-03-15 15:53 0object Object.Invoke(Delegate ... -
JQuery的WebServices调用
2013-03-14 14:12 0http://blog.sina.com.cn/s/blog_ ... -
c# list和string
2012-10-26 15:16 978C# List和String互相转换 (2011-06- ... -
.net mysql-connector-net
2012-10-19 11:10 1011引用DLL引用 mysql-connector-net包中的M ... -
c# 操作mysql
2012-10-19 10:21 931using System;using System.Confi ... -
c# DataTable.copy .clone
2012-10-17 18:17 4129C# DataTable.Copy()和.Clone()的使用 ... -
C#中避免相同MDI子窗口重复打开的方法(转)
2012-10-17 13:40 1147方法一: 直接检测 ... -
C# 中使用JSON - DataContractJsonSerializer
2012-10-11 14:47 690http://www.cnblogs.com/coderzh/ ... -
.NET WHERE子句用途
2012-05-04 14:52 1522where 子句用于指定类型约束,这些约束可以作为泛型声明 ... -
c#泛型
2012-05-04 14:51 1061http://hjf1223.cnblogs.com/arch ... -
汉字转换成拼音的类(转)
2012-02-27 16:41 63858引用地址: http://blog.csdn.net/huig ... -
ASP.NET内置对象(转)
2011-12-08 13:53 3152http://www.cnblogs. ... -
asp.net webservice
2011-12-04 15:22 1839asp.net webservice 概述与 ... -
iis发布asp.net网站(转)
2011-11-23 10:32 3357iis发布asp.net 网站 ... -
win7 里配置iis 和asp.net步骤,及发布asp.net网站全程(转)
2011-11-23 10:15 5505分享 win7 里配置 iis 和a ... -
类似Windows Search的文件搜索系统
2011-11-23 09:42 1316转自:http://www.cnblogs.com/wu ... -
操作PDF文档功能的相关开源项目探索—iTextSharp 和PDFBox
2011-11-23 09:40 1975转自www.th7.cn第七城市 操作 PDF 文档功 ... -
pdf
2011-12-10 13:28 1180http://www.cnblogs.com/q1490722 ... -
iis asp.net安装顺序
2011-11-17 13:47 946如果先安装IIS再安装 .Net Framework。一切OK ... -
IIS配置
2011-11-17 13:18 820http://bbs.51cto.com/thread-488 ...
相关推荐
在C#中实现服务器与客户端的聊天程序是一个基础的网络编程任务,主要涉及到Socket编程、多线程以及用户界面的设计。以下将详细讲解这个过程。 首先,了解Socket的基础概念至关重要。Socket是网络通信的一种接口,它...
在IT领域,网络通信是不可或缺的一部分,而"服务器+客户端的聊天程序(C#)"就是一个典型的网络编程示例。本教程将深入探讨如何使用C#语言和SOCKET技术构建这样一个聊天系统,让两个或多个用户通过互联网进行实时通信...
文件列表中的"SocketServer(C#SuperSocket服务器的简易实现)---客户端源程序",暗示了这个压缩包不仅包含了一个简单的SuperSocket服务器实现,还包含了与之配合使用的客户端源代码。客户端源程序通常会包含一个或...
本示例中,我们探讨的是如何利用C#的WinForm来创建一个基于Socket的服务端和客户端,实现两者之间的消息传递,以及在服务器断线后的重连机制。 首先,Socket在C#中是System.Net.Sockets命名空间下的类,它提供了TCP...
这个项目提供了一个基础的示例,帮助学习者理解服务器客户端通信的基本原理和C#中的实现方式。在实际开发中,我们还需要考虑安全、性能优化和异常处理等多个方面,以确保应用的稳定性和健壮性。
本示例源码提供了C#语言实现的高并发SOCKET服务器和客户端的完整工程实例,这为开发者提供了学习和实践网络通信机制的机会。C#作为一种强大的.NET平台语言,拥有丰富的库支持,使得构建这样的系统变得相对简单。 ...
在本项目中,"C#使用SuperSocket实现自定义协议实现CS架构服务器和客户端程序设计"),开发者利用C#编程语言以及SuperSocket开源库构建了一套C/S(客户端/服务器)架构的应用。SuperSocket是一个轻量级、高度可扩展的...
本篇将深入讲解如何使用C#编写Socket服务器和客户端,以及相关的关键知识点。 一、Socket简介 Socket是网络通信的基础接口,它允许应用程序通过Internet进行通信。在C#中,System.Net.Sockets命名空间提供了Socket...
本教程将深入讲解C#中的Socket通信,包括客户端和服务器端的实现,以及如何通过源码学习相关知识。 首先,我们要理解Socket的基本概念。Socket,也称为套接字,是网络通信中的一个接口,它允许应用程序通过网络发送...
Socket通信在IT行业中是网络编程的基础,特别是在C#开发中,它被广泛用于构建服务器和客户端应用程序,实现数据的高效传输。本项目包含了一个完整的C#版Socket通信示例,涵盖了服务端、客户端以及WebSocket的实现,...
本示例主要介绍了如何使用C#的Socket类进行基本的服务器与客户端通信。 首先,让我们深入理解Socket。Socket是网络通信的基本组件,它代表了网络上两个应用程序间的通信端点。在C#中,Socket类位于System.Net....
在IT行业中,网络编程是构建分布式系统和互联网应用程序的关键部分,而C#语言结合Socket编程则为开发者提供了强大的工具来实现这一点。本实例中的"C#+SOCKET实例(含有客户端和服务器端)源码"旨在帮助开发者理解如何...
在IT行业中,网络通信是不可或缺的一部分,而C#语言提供了强大的Socket编程能力,使得开发者能够构建可靠的TCP客户端和服务器应用程序。本篇文章将深入探讨C# Socket客户端和服务器的实现细节,以及如何处理多个...
本示例涉及的是使用C#编程语言实现的TCP服务器和客户端,它们具有心跳机制以确保连接的稳定性和可靠性。Unity是一个广泛用于游戏开发的跨平台引擎,它支持C#脚本,因此这个项目可能是为Unity游戏或应用程序设计的...
在本资源中,包含了Linux C语言和Windows C#平台下的服务器和客户端程序,覆盖了TCP协议的实现。接下来,我们将深入探讨这些知识点。 1. **Socket接口**: Socket是操作系统提供的一个接口,它允许应用程序通过...
C# 是一种广泛用于开发Windows应用程序和网络应用的语言,其中Socket编程是实现网络通信的核心部分。Socket,也被称作套接字,是进程间通信(IPC)的一种方式,尤其适用于跨网络的通信。在C#中,我们可以使用System...
在本文中,我们将深入探讨如何使用C#编程语言构建一个简易聊天室,涵盖服务器端和客户端的实现。这个聊天室项目实现了即时通讯的基本功能,包括登录、退出、发送系统消息、公共通讯以及私密对话。我们将围绕以下几个...
在IT领域,网络通信是不可或缺的一部分,而Socket编程则是实现跨网络通信的一种基本技术。本文将深入探讨如何在C#环境中使用Socket进行服务器和客户端的通信。C#提供了丰富的类库,使得Socket编程变得相对简单,我们...
本教程将深入探讨如何使用C#编程语言以及SuperSocket库来构建一个高效、稳定的服务器端和客户端通信模型。SuperSocket是一个轻量级且易于使用的.NET Socket服务端开发框架,它为开发者提供了构建自定义网络应用的...
本文将深入探讨如何使用C#语言来实现一个基于Socket的聊天程序,这将涉及到网络编程的基础概念、C#的Socket类以及如何构建一个简单的聊天服务器。 首先,我们需要理解什么是Socket。Socket,也称为网络套接字,是...