- 浏览: 793810 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (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 989C# List和String互相转换 (2011-06- ... -
.net mysql-connector-net
2012-10-19 11:10 1026引用DLL引用 mysql-connector-net包中的M ... -
c# 操作mysql
2012-10-19 10:21 944using System;using System.Confi ... -
c# DataTable.copy .clone
2012-10-17 18:17 4144C# DataTable.Copy()和.Clone()的使用 ... -
C#中避免相同MDI子窗口重复打开的方法(转)
2012-10-17 13:40 1160方法一: 直接检测 ... -
C# 中使用JSON - DataContractJsonSerializer
2012-10-11 14:47 730http://www.cnblogs.com/coderzh/ ... -
.NET WHERE子句用途
2012-05-04 14:52 1532where 子句用于指定类型约束,这些约束可以作为泛型声明 ... -
c#泛型
2012-05-04 14:51 1069http://hjf1223.cnblogs.com/arch ... -
汉字转换成拼音的类(转)
2012-02-27 16:41 64504引用地址: http://blog.csdn.net/huig ... -
ASP.NET内置对象(转)
2011-12-08 13:53 3166http://www.cnblogs. ... -
asp.net webservice
2011-12-04 15:22 1844asp.net webservice 概述与 ... -
iis发布asp.net网站(转)
2011-11-23 10:32 3368iis发布asp.net 网站 ... -
win7 里配置iis 和asp.net步骤,及发布asp.net网站全程(转)
2011-11-23 10:15 5520分享 win7 里配置 iis 和a ... -
类似Windows Search的文件搜索系统
2011-11-23 09:42 1332转自:http://www.cnblogs.com/wu ... -
操作PDF文档功能的相关开源项目探索—iTextSharp 和PDFBox
2011-11-23 09:40 1992转自www.th7.cn第七城市 操作 PDF 文档功 ... -
pdf
2011-12-10 13:28 1185http://www.cnblogs.com/q1490722 ... -
iis asp.net安装顺序
2011-11-17 13:47 972如果先安装IIS再安装 .Net Framework。一切OK ... -
IIS配置
2011-11-17 13:18 847http://bbs.51cto.com/thread-488 ...
相关推荐
PC间用ACL和TRP协议
基于西门子S7-1200PLC的立体车库创新设计:融入新能源汽车充电元素,简约而不简单的智能化方案,基于西门子S7-1200PLC的立体车库设计设计 针对古老传统的立体车库进行创新,引入当下流行的新能源汽车充电元素,简约而不简单 包含:程序,图纸,仿真 ,关键词:基于西门子S7-1200PLC; 立体车库设计; 创新; 新能源汽车充电元素; 简约设计; 程序; 图纸; 仿真。,基于新能源充电的西门子S7-1200PLC立体车库创新设计:程序、图纸与仿真,简约而不凡
陕西省国家级非物质文化遗产经纬度数据统计表 统计内容包含以下字段: 1. 项目名称 2. 遗产类别 3. 入选批次 4. 所属地区 5. 申报地区/单位 6. 保护单位 7. 地理经度 8. 地理纬度 该统计表系统记录了陕西省国家级非物质文化遗产的地理空间信息,为文化遗产的数字化保护与研究工作提供了重要的数据支撑。
GBT27023复习备考
vivado MIPS32五级流水CPU设计
基于MBD开发手册的《Application Modeling Guideline:辅助驾驶系统中的数学模型设计与应用》,Application Modeling Guideline 文档57页 基于MBD开发手册包含: 1. MBD概述:文档可能会介绍MBD的基本概念,解释为什么它在辅助驾驶系统开发中至关重要。 MBD允许工程师使用数学模型来描述系统行为,这有助于早期发现问题,减少硬件原型制作的需求。 2. 工具选择:在辅助驾驶开发中,常用的MBD工具有MATLAB Simulink、MathWorks的Simulink Design Verifier、Vector的CANoe等。 文档可能涵盖这些工具的特点和适用场景,帮助开发者选择合适的工具。 3. 模型设计:MBD的核心是模型设计,文档会详细说明如何创建和组织模型结构,包括输入 输出接口定义、状态机设计、算法实现等。 对于辅助驾驶系统,这可能涉及到视觉处理、传感器融合、路径规划、决策制定等多个模块。 4. 仿真与验证:MBD工具支持动态仿真,开发者可以运行模型以验证其功能。 文档会介绍如何设置仿真条件,进行时序分析,以及如
LabVIEW曲线处理与包络线判断功能:准确判断,附带Demo及完整源码,labview做的曲线处理,包络线判断功能,判断准确。 一个demo,有源码 ,Labview曲线处理; 包络线判断功能; 判断准确; 有源码Demo; 包络线功能Demo; 准确度。,LabVIEW曲线处理与包络线精准判断功能Demo源码分享
2021年06月Scratch三级实操
GBT27067复习备考
基于nRF905的实验室温湿度监测系统研究.pdf
2022年12月机器人六级理论
Unity Shader Graph 2D - 角色身上部件高亮Bloom效果
大四-校内实习第四天(五)
2020年09月机器人五级实操
springboot停车场管理系统,含有完整的源码和报告文档
基于MPC模型预测算法的轨迹跟踪控制研究:双仿真比较及侧偏角软约束的重要性分析,基于mpc模型预测轨迹跟踪控制,总共包含两套仿真,一套是不加入四轮侧偏角软约束,一套是加入四轮侧偏角的软约束控制,通过carsim与simulink联合仿真发现加入侧偏角软约束在进行轨迹跟踪时,能够通过控制四轮侧偏角的变化,较好的实现轨迹跟踪;而不加入侧偏角软约束的,发现车辆由于失去稳定性, 轨迹跟踪失败( 该仿真是学习mpc模型预测算法控制和基于车辆动力学轨迹跟踪控制非常好的学习资料)。 文件中参考文献和文件说明。 ,基于mpc模型预测轨迹跟踪控制; 四轮侧偏角软约束; 车辆稳定性; 轨迹跟踪失败; carsim与simulink联合仿真; mpc模型预测算法控制; 车辆动力学轨迹跟踪控制。,MPC模型预测轨迹跟踪控制:侧偏角软约束与车辆稳定性的联合仿真研究
基于扩展卡尔曼滤波算法的车辆多状态精确估计与仿真研究:融合位置、轨迹、速度及加速度的实时动态监测,基于扩展卡尔曼滤波EKF的车辆状态估计 估计的状态包括: 1. 车辆的横纵向位置 2.车辆行驶轨迹、横摆角、 3. 车速、加速度、横摆角速度 4. 相应的估计偏差。 内容附带:Simulink模型与MATLAB代马,以及参考文档。 ,基于扩展卡尔曼滤波; 车辆状态估计; 横纵向位置估计; 行驶轨迹估计; 横摆角估计; 车速估计; 加速度估计; 横摆角速度估计; 估计偏差; Simulink模型; MATLAB代码; 参考文档。,"基于扩展卡尔曼滤波的车辆多状态估计系统及其偏差分析:Simulink模型与MATLAB代码实现"
"基于V-REP与MATLAB联合仿真的小车项目:循迹、避障、走迷宫及路径规划的详细代码与文档说明匹配版",V-REP小车项目+匹配文档,基于V-REP与MATLAB联合仿真,小车能够完成循迹、避障、走迷宫和路径规划,提供详细代码和文档说明。 ,核心关键词:V-REP小车项目; 匹配文档; 联合仿真; 循迹; 避障; 走迷宫; 路径规划; 详细代码; 文档说明。,V-REP小车项目:循迹避障与路径规划联合仿真实现
2022年7月环境管理体系基础