C# C/S UDP一对多异步通信

w_angfei 2013-09-26 08:04:58
服务器端:
public class StateObject
{
//服务器端
public Socket udpServer = null;
//接受数据缓冲区
public byte[] buffer = new byte[10*1024];
//远程终端
public EndPoint remoteEP;

public bool flag = false;
}


  private void ServerForm_Load(object sender, EventArgs e)
{
StartServer startServer = new StartServer();
thread = new Thread(new ThreadStart(startServer.ServerBind));
thread.Start();
}

#region 服务器绑定终端节点
        public void ServerBind()
{
//主机IP
IPEndPoint serverIp = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8686);
Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpServer.Bind(serverIp);
IPEndPoint clientIp = new IPEndPoint(IPAddress.Any, 0);
state = new StateObject();
state.udpServer = udpServer;
state.remoteEP = (EndPoint)clientIp;
AsynRecive();
}
#endregion

#region 异步接受消息
public void AsynRecive()
{
lock (state)
{
state.udpServer.BeginReceiveFrom(state.buffer, 0, state.buffer.Length, SocketFlags.None, ref state.remoteEP,
new AsyncCallback(ReciveCallback), null);
receiveDone.WaitOne();
}
}
#endregion

#region 异步接受消息回调函数
public void ReciveCallback(IAsyncResult asyncResult)
{
if (asyncResult.IsCompleted)
{
//获取发送端的终节点
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
EndPoint remoteEP = (EndPoint)ipep;
state.udpServer.EndReceiveFrom(asyncResult, ref remoteEP);
data = new byte[10*1024];
state.buffer.CopyTo(data, 0);
state.buffer = new byte[10*1024];
int i = 0;
///取出命令
for (i = 0; i < leng; i++)
{
if (Convert.ToInt32(data[i]) == 0)
break;
}
byte[] cmdbyte = new byte[i];
for (int k = 0; k < i; k++)
{
cmdbyte[k] = data[k];
}
commandStr = Encoding.ASCII.GetString(cmdbyte);
if(!commandStr.Equals("connect"))
MessageBox.Show(commandStr, "kkk");
handleMsg(commandStr);

state.remoteEP = remoteEP;
receiveDone.Set();
AsynRecive();//继续接受消息
}
}
#endregion

#region 异步发送消息
public void AsynSend(byte[] buffer)
{
state.udpServer.BeginSendTo(buffer, 0, buffer.Length, SocketFlags.None, state.remoteEP,
new AsyncCallback(SendCallback), null);
sendDone.WaitOne();
}
#endregion

#region 异步发送消息回调函数
public void SendCallback(IAsyncResult asyncResult)
{
//消息发送完毕
if (asyncResult.IsCompleted)
{
state.udpServer.EndSendTo(asyncResult);
}
sendDone.Set();
}
#endregion
private void handleMsg(String msg)
{

}


客户端:
 public class StateObject
{
//客户端套接字
public Socket udpClient = null;
//接收信息缓冲区
public byte[] buffer = new byte[10*1024];
//服务器端终节点
public IPEndPoint serverIp;
//远程终端节点
public EndPoint remoteEP;

}

 private void 登陆_Load(object sender, EventArgs e)
{
contactWithServer = new ContactWithServer(this);
clientcontactserverThread = new Thread(new ThreadStart(contactWithServer.AsynRecive));
clientcontactserverThread.Start();
}


public ContactWithServer(登陆 loginForm)
{
this.loginForm = loginForm;
state = new StateObject();
state.udpClient = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
state.serverIp = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8686);
state.remoteEP = (EndPoint)(new IPEndPoint(IPAddress.Any, 0));
//此处注意:
// 由于当前是客户端,所以没有绑定终节点
// 不可直接接收消息,必须先向其他终端发送信息告知本机终节点
string msg = "connect";
byte[] buffer = Encoding.ASCII.GetBytes(msg);
AsynSend(buffer);
}
#region 异步接收来自其他终端发送的消息
public void AsynRecive()
{
state.udpClient.BeginReceiveFrom(state.buffer, 0, state.buffer.Length, SocketFlags.None, ref state.remoteEP,
new AsyncCallback(ReciveCallback), null);
receiveDone.WaitOne();
}
#endregion

#region 异步接收来自其他终端发送的消息回调函数
public void ReciveCallback(IAsyncResult asyncResult)
{
//信息接收完成
if (asyncResult.IsCompleted)
{
state.udpClient.EndReceiveFrom(asyncResult, ref state.remoteEP);
data=new byte[10*1024];
state.buffer.CopyTo(data,0);
if (data.Length < 20) //只有命令
commandStr = Encoding.ASCII.GetString(data);
else
{
int i = 0;
///取出命令
for (i = 0; i < leng; i++)
{
if (Convert.ToInt32(data[i]) == 0)
break;
}
byte[] cmdbyte = new byte[i];
for (int k = 0; k < i; k++)
{
cmdbyte[k] = data[k];
}
commandStr = Encoding.ASCII.GetString(cmdbyte);
}
MessageBox.Show(commandStr, "来自服务器的命令!");
handleMsg(commandStr);
state.buffer=new byte[10*1024];
AsynRecive();
receiveDone.Set();
}
}
#endregion

#region 异步发送消息
public void AsynSend(byte[] buffer)
{
state.udpClient.BeginSendTo(buffer, 0, buffer.Length, SocketFlags.None, state.serverIp,
new AsyncCallback(SendCallback), null);
sendDone.WaitOne();
}
#endregion

#region 异步发送消息回调函数
public void SendCallback(IAsyncResult asyncResult)
{
//消息发送完成
if (asyncResult.IsCompleted)
{
state.udpClient.EndSendTo(asyncResult);
}
sendDone.Set();
}
#endregion

上面的代码可以正确实现服务器与客户端一对一的通信,但是我现在需要一对多的,该怎样修改呢?
...全文
3111 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
a1295962107 2014-12-27
  • 打赏
  • 举报
回复
你解决了吗1对多
a1295962107 2014-12-27
  • 打赏
  • 举报
回复
哪句代码位置写错了
WayToAccept 2014-05-04
  • 打赏
  • 举报
回复
楼主最后怎么实现一对多的,可否告知,最近做一个即时通信也遇到问题了
华为黑名单 2013-09-27
  • 打赏
  • 举报
回复
引用 7 楼 u011443241 的回复:
希望以后谁写这块少走点弯路。。。
localEP = new IPEndPoint(IPAddress.Any, PortNum); listener.Bind(localEP); 搞了2次!我的代码可以直接拿着用!
linuxca 2013-09-27
  • 打赏
  • 举报
回复
w_angfei 2013-09-27
  • 打赏
  • 举报
回复
希望以后谁写这块少走点弯路。。。
华为黑名单 2013-09-27
  • 打赏
  • 举报
回复
逻辑确实没什么问题!
华为黑名单 2013-09-27
  • 打赏
  • 举报
回复
using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Net; namespace tti365.ConsumeSmg365WS.Common { class BranchInfo { private byte[] _Buffer = new byte[4 * 1024];//接收数据缓存 private Socket _Socket;//客户端套接字 private int _MessageLength;//文件头大小 private int _OperationCode;//操作码 private byte[] _SendBuffer = new byte[4 * 1024];//发送数据的缓存 private int _ErrorTime; private string _BranchNo; private DateTime _Time; public EndPoint RePoint =(EndPoint)new IPEndPoint(IPAddress.Any,0) ; /// <summary> /// UDP 套接字包 /// </summary> public Socket Socket { set { _Socket = value; } get { return _Socket; } } /// <summary> /// 发送短IP /// </summary> //public EndPoint RePoint //{ // set { _RePoint = value; } // get { return _RePoint; } //} /// <summary> /// 数据缓存包 /// </summary> public byte[] Buffer { set { _Buffer = value; } get { return _Buffer; } } /// <summary> /// 数据包大小 /// </summary> public int MessageLength { set { _MessageLength = value; } get { return _MessageLength; } } /// <summary> /// 操作码 /// </summary> public int OperationCode { set { _OperationCode = value; } get { return _OperationCode; } } /// <summary> /// 发送数据包 /// </summary> public byte[] SendBuffer { set { _SendBuffer = value; } get { return _SendBuffer; } } /// <summary> /// 错误次数 /// </summary> public int ErrorTime { set { _ErrorTime = value; } get { return _ErrorTime; } } /// <summary> /// 接收机构类码 /// </summary> public string BranchNo { set { _BranchNo = value; } get { return _BranchNo; } } /// <summary> /// 时间 /// </summary> public DateTime Time { set { _Time = value; } get { return _Time; } } } }
w_angfei 2013-09-27
  • 打赏
  • 举报
回复
找见问题了,一句代码的位置写错了,太不仔细了,这个逻辑是没问题的
华为黑名单 2013-09-27
  • 打赏
  • 举报
回复
private delegate void WriteWrongLogHandle(string str); private delegate void WriteLogHandle(byte[] byteData); //本机IP地址 private IPEndPoint localEP; //将要发送的IP地址 // private EndPoint RemotePoint; //网络端口 Socket listener = null;//udp private static bool isListener = true;//控制服务器监控服务 Dictionary<string, EndPoint> dic = null; //IP信息字典 private static readonly object padlock = new object(); private int MessageLength;//数据包大小 private int OperationCode;//操作内码 private Socket handle; private BranchInfo info = null; private string BranchNo;//机构内码 private int MsgThreadNum;//运行通讯线程数目 private int PortNum;//端口数目 private string ServerIp;// private ManualResetEvent receiveDone = null; private bool IsLog = false; //是否写日志 #region 服务启动 protected override void OnStart(string[] args) { try { // TODO: 在此处添加代码以启动服务。 //启动PosConm服务时开始写日志 // Utils.WriteLogFile("正在启动ConsumeSmg服务..."); String strFileName = AppDomain.CurrentDomain.BaseDirectory + "\\ConsumeMsg.xml"; XmlDocument doc = new XmlDocument(); doc.Load(strFileName); // WriteExceptionLog(strFileName); XmlNodeList listNode = doc.GetElementsByTagName("settings"); foreach (XmlNode node in listNode[0].ChildNodes) { switch (node.Name) { case "ServerIp": ServerIp = node.InnerText; break; case "PortNum": PortNum = Convert.ToInt32(node.InnerText); break; case "MsgThreadNum": MsgThreadNum = Convert.ToInt32(node.InnerText); break; case "IsLog": IsLog = Convert.ToBoolean(Convert.ToInt32(node.InnerText)); break; default: break; } } if (IsLog) { WriteExceptionLog("正在启动ConsumeSmg服务..."); } dic = new Dictionary<string, EndPoint>(); //IP信息字典 info = new BranchInfo(); receiveDone = new ManualResetEvent(false); listener = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//udp localEP = new IPEndPoint(IPAddress.Any, PortNum); listener.Bind(localEP); isListener = true; if (IsLog) { WriteExceptionLog(ServerIp + "[" + PortNum + "]"); } try { //开多线程通讯 //for (int i = 0; i < MsgThreadNum; i++) //{ Thread acceptWorkThread = new Thread(AcceptWorkThread); acceptWorkThread.Start(); //} Thread updateDicThread = new Thread(new ThreadStart(UpdateDictionaryThread)); updateDicThread.Start(); } catch (Exception ex) { if (IsLog) { WriteExceptionLog("开始启动接收线程" + ex.Message); } } } catch (Exception ex) { if (IsLog) { WriteExceptionLog("启动服务失败:" + ex.Message); } Stop(); } } #endregion public void AcceptWorkThread() { ////本机IP从XML文件中读取 try { //异步接收数据 info = new BranchInfo(); info.Socket = listener; listener.BeginReceiveFrom(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, ref info.RePoint, new AsyncCallback(ReceiveCallBack), info); receiveDone.WaitOne(); Thread.Sleep(100); if (IsLog) { WriteExceptionLog("打印从客户端传输过来的字节数组"); } //WriteByteDataLog(info.Buffer); } catch (Exception ex) { if (IsLog) { WriteExceptionLog("异步接收短消息" + ex.Message); } Stop(); } } 服务端
w_angfei 2013-09-27
  • 打赏
  • 举报
回复
这是怎么了,都没人来看看
w_angfei 2013-09-27
  • 打赏
  • 举报
回复
引用 9 楼 luodayoudianzi 的回复:
[quote=引用 7 楼 u011443241 的回复:] 希望以后谁写这块少走点弯路。。。
localEP = new IPEndPoint(IPAddress.Any, PortNum); listener.Bind(localEP); 搞了2次!我的代码可以直接拿着用![/quote]搞了两次是什么意思?
w_angfei 2013-09-26
  • 打赏
  • 举报
回复
自己顶下,大家帮忙看看吧
SanNiuSignal是一个基于异步socket的完全免费DLL;它里面封装了Client,Server以及UDP;有了这个DLL;用户不用去关心心跳;粘包 ;组包;发送文件等繁琐的事情;大家只要简单的几步就能实现强大的通信系统;能帮助到大家是本人觉得最幸福的事情,也希望大家 在用的过程中找出DLL中不足的地方;好改正;此DLL的苹果版和java版正在努力开发中......交流QQ:365368248;此演示源码下载地址:http://pan.baidu.com/s/1eQw1npw 里面包括了SanNiuSignal.DLL 下面为大家介绍一下 如何使用SanNiuSignal. 1 ) :TCPServer服务器,通过静态方法TxStart.startServer注册成功服务器ITxServer;然后通过ITxServer设置好各种属性;最后启动 ITxServer.StartEngine();就可以了;具体可以到demo里去看;相对来说比较简单,下面来说一下需要注意的地方 一:ITxServer.BufferSize,就是接收数据缓冲区大小;默认为1kb,不要小于50字节,而且要和客户端设置成一样;否则会出现不可预知 的错误;这个缓冲区的大小,不会影响你每次发送数据的大小;大小只能提高你的发送速度 二:ITxServer.sendMessage 发送前先判断此IPEndPoint客户端是否在线;因为如果不在线等情况发生;此方法没有任何消息产生;如 果发送成功并且对方已经收到;会触发发送成功的事件; 三:用户可以通过ITxServer.FileLog记录服务器的运行信息; 2 ) :TCPClient客户端,通过静态方法TxStart.startClient(服务器地址或网址, 服务器端口号)注册成功客户端ITxClient;然后通过 ITxClient设置好各种属性;最后启动ITxClient.StartEngine();跟服务器启动差不多;具体可以到demo里去看;客户端要注意的一些地 方 一:如果非服务器强制关闭客户端的情况下,掉线的话,客户端默认是要重连的;他的原理是这样的,每10秒重连一次;重连 ITxClient.ReconnectMax次如果失败;会自动关闭客户端引擎;在重连的过程中;你可以改变客户端连接服务器的IP地址和端口号;但 如果当断开的时候不想重连;可以设置ITxClient.ReconnectMax=0; 二:登录篇,在引擎启动之前,用户可以设置ITxClient.OutTime来设置超时时间;默认为10秒,也就是说10秒之内肯定会有一个登录结果 ;登录成功或登录失败。有了登录结果会触发登录结果事件; 3 ) :Udp引擎,通过静态方法TxStart.startUdp()注册成功UDP--IUdpTx;然后通过IUdpTx设置好各种属性;最后启动 IUdpTx.StartEngine();如果在启动之前要绑定端口号,请在这里设置IUdpTx.Port;否则是随机使用本地端口;无论是UDP还是服务器和 客户端;它们的很多方法和属性以及事件都是相同的,因为他们都继承了通信系统的基接口ITxBase;下面是UDP引擎要注意的地方 一:UDP的优势在于速度快但不太可靠;所以有些属性不能设置的太过,如IUdpTx.BufferSize;默认为1KB,如果在广域网上发送信息, 缓冲区大小不要超过默认值;否则数据会丢失,如果一次性数据大于1KB;也没事,系统会自动分包发送;不太会丢包。 4 ) :文件发送系统,通过静态方法FileStart.StartFileSend(IFileSendMust)生成一个文件发送系统IFileSend;其中IFileSendMust是 必须实现的一个接口;具体参照demo;然后通过IFileSend设置好各种属性;发送还是要通过前面的三个引擎系统发送的;如 ITxClient.SendFile 这时会返回一个文件标签,是一个整数;IFileSend可以通过操作这个标签来操作这个正在发送的文件;接收文件 系统也一样;也是通过文件标签来操作;文件续传也是一样,也要通过前面的三个通信引擎系统进行续传;因为文件系统不能决定用户 通过哪个通信系统进行续传的;例如IUdpTx.ContinueFile进行续传;大家也可以试一下 掉线之后重新连接也可以续传; 5 ) :文件接收系统,通过静态方法FileStart.StartFileReceive(IFileReceiveMust)生成一个文件接收系统IFileReceive;其中 IFileReceiveMust是接收方必须实现的一个接口;具体参照demo;然后通过IFileReceive设置好各种属性;下面来讲讲文件系统要注意 的几个要点 一:每个文件都有一个文件标签,发送系统和接收系统是通过控制这个标签来控制这个文件的;如果是同一个文件传输,标签也一样的; 二:要注意属性BufferSize缓冲区大小,他是代表一次传送的字节数;如果这个文件缓冲区越大,传输速度越快;具体要设置成多少,大 家自己去调试;TCP传输的话一般可以设置成比较大,但UDP的话这个不要超过1KB;所以传输大文件尽量不要用UDP这种不可靠的东东; 三:当网络等各种原因中断文件的时候;会触发文件中断事件;文件自动处于暂停发送或接收状态;等待续传;续传的发送方,如果对方 同意续传;对方将不会触发续传开始的方法;别的大家可以通过demo里去发现; 总结: 其实这个DLL相对来讲是比较简单的;大家只要掌握这五个接口;1:ITxServer TCP服务器接口 2:ITxClient TCP客户端接口 3:IUdpTx UDP接口 4:IFileSend 文件发送方接口 5:IFileReceive 文件接收方接口 前面三个接口是通过TxStart启动;后面二个文件接口 是通过FileStart启动 今天先讲到这里;希望这个DLL对大家有所帮助;不足之处希望通过QQ或博客园大家一起交流;谢谢 此演示源码下载地址:http://pan.baidu.com/s/1eQw1npw 里面包括了SanNiuSignal.DLL
本书详细介绍了利用Visual C# 2005进行网络编程的方法和技巧。全书共分13章,主要内容包括网络编程原理、Visual C# 2005的套接字以及多线程的开发、基于各种不同协议的网络编程应用模块,并通过几个典型的实例介绍了Visual C# 2005网络编程的实际应用。 本书注重代码的通用性和工程实践性,书中提供的通用模块和典型实例稍加修改就可以为读者所用。   本书不仅适用于使用Visual C# 2005进行软件开发的广大软件开发人员,也适合高等院校师生学习和参考使用,特别对高校计算机专业的学生进行毕业设计具有非常好的指导价值,也可以作为广大计算机编程爱好者的自学参考书。 第1章 C#.NET网络编程概述  1.1 网络通信概述   1.1.1 网络通信模型概述   1.1.2 网络通信协议、接口和服务概述   1.1.3 TCP/IP网络架构概述   1.1.4 IP地址与端口  1.2 C#.NET网络编程相关类   1.2.1 IPAddress类   1.2.2 DNS类   1.2.3 IPHostEntry类   1.2.4 IPEndPoint类   1.2.5 Socket类  1.3 套接字概述   1.3.1 套接字的类型和常用属性   1.3.2 建立面向连接的套接字   1.3.3 建立面向无连接的套接字  1.4 使用套接字的简单示例   1.4.1 C/S与B/S架构通信模式概述   1.4.2 编写客户端代码   1.4.3 编写服务器端代码 .  1.4.4 无阻塞套接字  1.5 本章小结 第2章 C#.NET高级网络编程技术概述  2.1 线程与网络通信   2.1.1 基于线程的网络通信概述   2.1.2 在网络编程中使用多线程   2.1.3 线程基础   2.1.4 多线程在网络编程中的应用  2.2 网络通信的常见问题   2.2.1 让网络通信代码更强壮   2.2.2 数据缓冲区处理方法  2.3 TCP无保护消息边界   2.3.1 发送固定长度的消息   2.3.2 采用变长的消息   2.3.3 使用特殊标记处理消息  2.4 本章小结 第3章 开发基于TCP协议的应用程序  3.1 套接字与TCP协议   3.1.1 使用套接字传输数据   3.1.2 NetworkStream对象同数据发送与接收   3.1.3 TcpClient与TcpListener类   3.1.4 使用TCP/IP协议编写应用层的通信代码  3.2 开发异步的TCP应用编程   3.2.1 TCP的异步通信流程   3.2.2 线程阻塞与异步中的同步问题  3.3 开发异步的TCP聊天程序   3.3.1 客户端界面设计   3.3.2 客户端业务逻辑设计   3.3.3 服务器端界面设计   3.3.4 服务器端业务逻辑设计   3.3.5 运行界面  3.4 本章小结 第4章 开发基于UDP的应用程序  4.1 UDP通信协议概述   4.1.1 UDP协议与TCP协议的差别   4.1.2 UDP协议的使用场合  4.2 在C#UDP协议的相关类   4.2.1 IPAddress类   4.2.2 UdpClient类的构造函数   4.2.3 UdpClient类的常用方法与实例  4.3 UDP协议使用示例   4.3.1 UDP模块功能概述   4.3.2 设计通信流程   4.3.3 开发服务器端程序   4.3.4 开发客户端程序   4.3.5 使用多线程开发UDP协议   4.3.6 使用校验保证信息完整性   4.3.7 效果演示  4.4 本章小结 第5章 开发基于SNMP协议的应用程序  5.1 SNMP协议概述   5.1.1 了解SNMP协议   5.1.2 SNMP的常用命令   5.1.3 设计SNMP包  5.2 SNMP协议使用示例   5.2.1 需求分析与设计   5.2.2 设计程序流程   5.2.3 程序窗口界面设计   5.2.4 SNMP类编写   5.2.5 SNMP程序窗口类编写  5.3 运行效果演示  5.4 使用供货商提供的MIB库  5.5 本章小结 第6章 使用.NET发送邮件  6.1 邮件发送与接收协议概述   6.1.1 SMTP协议与邮件发送   6.1.2 POP3协议与邮件接收   6.1.3 .NET下支持SMTP和POP3的类  6.2 邮件发送与接收模块   6.2.1 需求分析与设计   6.2.2 设计邮件发送和接收的流程   6.2.3 界面设计   6.2.4 编写主窗口的业务逻辑   6.2.5 编写发送邮件的业务逻辑   6.2.6 编写接收邮件的业务逻辑   6.2.7 使用多线程发送与接收邮件  6.3 运行效果演示  6.4 本章小结 第7章 FTP下载与文件传输  7.1 FTP协议概述   7.1.1 使用FTP协议下载文件的流程   7.1.2 相关类库说明  7.2 FTP客户端设计   7.2.1 需求分析   7.2.2 界面设计   7.2.3 业务逻辑设计  7.3 FTP服务器端设计   7.3.1 需求分析   7.3.2 FTP响应码   7.3.3 业务逻辑设计  7.4 运行界面  7.5 本章小结 第8章 基于C#.NET的网络管理模块  8.1 ICMP协议概述   8.1.1 ping命令   8.1.2 tracert命令  8.2 ICMP包  8.3 编写网络管理模块   8.3.1 需求分析   8.3.2 界面设计   8.3.3 编写核心icmp类的业务逻辑   8.3.4 编写具有ping功能的业务逻辑   8.3.5 编写具有tracert功能的业务逻辑   8.3.6 编写findmask功能的业务逻辑   8.3.7 编写时间戳功能的业务逻辑  8.4 运行界面  8.5 本章小结 第9章 编写基于.NET的Web Service  9.1 Web Service概述   9.1.1 Web服务基本概念   9.1.2 Web服务的优势   9.1.3 Web服务的架构  9.2 需求分析与设计   9.2.1 需求分析   9.2.2 文件功能设计   9.2.3 数据库设计  9.3 编写Web Service服务系统   9.3.1 构建Web Service   9.3.2 编写Web服务代码   9.3.3 主页面与登录相关的WebService数据访问模块   9.3.4 发表主题相关的Web Service访问模块   9.3.5 投票相关的Web Service访问模块   9.3.6 管理相关的Web Service访问模块  9.4 主页面与登录模块   9.4.1 界面设计   9.4.2 编写业务逻辑  9.5 发表主题模块   9.5.1 界面设计   9.5.2 编写业务逻辑  9.6 投票模块   9.6.1 界面设计   9.6.2 编写业务逻辑  9.7 管理模块   9.7.1 界面设计   9.7.2 编写业务逻辑  9.8 本章小结 第10章 基于.NET的远程技术  10.1 远程技术概述   10.1.1 远程技术开发结构   10.1.2 远程技术使用  10.2 远程控制开发客户端的设计   10.2.1 界面设计与控件使用   10.2.2 客户端的代码设计  10.3 远程控制开发服务器端的设计   10.3.1 界面设计与控件使用   10.3.2 服务器端的代码设计  10.4 运行效果演示  10.5 本章小结 第11章 流媒体在线播放  11.1 需求分析与设计   11.1.1 需求分析   11.1.2 模块设计   11.1.3 数据库设计  11.2 DirectShow接口   11.2.1 滤波图模型   11.2.2 如何使用DirectShow接口   11.2.3 流媒体在线播放相关接口  11.3 流媒体协议   11.3.1 实时传输协议(RTP)   11.3.2 实时传输控制协议(RTCP)   11.3.3 实时流传输协议(RTSP)   11.3.4 流媒体服务过程  11.4 建立.NET的窗体项目   11.4.1 主窗口界面设计   11.4.2 收藏夹数据库相关业务逻辑设计   11.4.3 流媒体在线播放器业务逻辑设计  11.5 运行效果演示  11.6 本章小结 第12章 在线五子棋系统模块  12.1 需求分析与设计   12.1.1 需求分析   12.1.2 模块设计  12.2 五子棋规则类设计   12.2.1 胜负判定类   12.2.2 行棋规则类  12.3 基于TCP协议的通信类   12.4 网络配置模块   12.4.1 网络配置模块的界面设计   12.4.2 网络配置模块的代码设计  12.5 扫描主机模块   12.5.1 扫描主机模块的界面设计   12.5.2 扫描主机模块的代码设计  12.6 主界面模块   12.6.1 主界面模块的界面设计   12.6.2 主界面模块的代码设计  12.7 运行界面  12.8 本章小结 第13章 基于HTTP协议的下载工具  13.1 HTTP协议   13.1.1 HTTP下载理论   13.1.2 .NET的几个支持HTTP协议的类  13.2 异步机制   13.2.1 异步机制的原理   13.2.2 异步类  13.3 下载工具的设计   13.3.1 需求设计   13.3.2 模块设计   13.3.3 界面设计   13.3.4 业务逻辑设计  13.4 运行效果演示  13.5 本章小结 Microsoft Visual C# 2005是一种新的编程环境,它是为生成在.NET Framework上运行的多种应用程序而设计的。C#简单,功能强大,类型安全,而且是面向对象的。C#凭借它的许多创新实现了对应用程序的快速开发。. Visual Studio支持Visual C#,这是通过功能齐全的代码编辑器、项目模板、设计器、代码向导、功能强大且易于使用的调试器以及其他工具实现的。通过.NET Framework类库,可以访问多种操作系统服务和其他有用的精心设计的类,这些类可显著加快开发周期。 本书大量地使用了.NET Framework提供的类库中的函数来协同开发,通过使用这些已经被封装的类来协助开发确实提高了不少效率,为开发工作带来了诸多的便利。 本书共分13章,第1章介绍了利用Visual C# 2005提供的网络命名空间下的诸多API进行套接字的开发,并对网络编程的原理进行了详细的阐述,为后续的章节奠定了基础。 第2章介绍了具有多线程能力的网络应用程序,这使得用户开发的程序能够适应更加复杂的情况。 第3章~第8章是本书的重要部分,主要介绍基于各种不同协议的网络编程应用模块。第3章介绍了基于TCP协议的聊天程序;第4章介绍了基于UDP的通信程序;第5章介绍了使用SNMP协议的网络管理程序;第6章介绍了使用SMTP以及POP3协议的E-mail系统;第7章介绍了基于FTP的文件传输模块;第8章介绍了使用ICMP协议的网络探测程序。 第9章介绍了基于Web Service的电子公告板系统,并结合采用了SQL Server 2005数据库;第10章介绍了使用远程控制技术的应用程序;第11章则介绍了流媒体在线播放系统。.. 第12章介绍了基于TCP通信协议的在线五子棋系统;第13章主要介绍了基于HTTP协议的下载工具,该工具具有多线程下载、断点续传的功能。 本书注重理论指导性和工程实践性,书中提供的各个网络应用程序只要稍加修改就可以为读者所用。本书不仅适用于使用Visual C# 2005进行软件开发的广大软件开发人员,也适合高等院校师生学习和参考使用,特别对高校计算机专业的学生进行毕业设计具有非常好的指导价值,也可以作为广大计算机编程爱好者的自学、参考用书。 本书主要由梅晓冬、颜烨青执笔,在编写本书程序的过程中,得到了陈璧元的大力支持,在此表示衷心的感谢。此外,还要感谢杨文军、程伟、袁远、刘武、彭澜、李通、李杰、卢茂琼、张燕生、胡燕生、邓湘成、卢下知、王周浩、邱岳、刘流、代本、刘明星、孙靖华等人,他们在本书编写过程中给予了我鼓励和支持。 由于时间仓促,加之水平有限,书中不足之处在所难免,敬请读者批评指正。... 编者 2008年1月

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧