一个Udp信息收发静态类!

最近准备利用.NET的套接字开发一个类似QQ的IM组件,先写了一个Udp信息收发静态类!也不是很完善,暂时先储备着,以后重构用!

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace XChatLib
{
    
/// <summary>
    
/// MessageUtility 消息工具类,该类是一个静态工具类。
    
/// </summary>

    public class MessageUtility
    
{

        
//缺省端口号
        private const int DEFAULT_PORT = 9050;

        
private MessageUtility()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }


        
//发送消息方法
        public static void SendMessage(string msg)
        
{
            
byte[] data = new byte[1024];
            
//本机主机信息
            IPHostEntry host = Dns.GetHostByName(Dns.GetHostName());

            
//端口号参数以后重构时可以做成一个方法从配置文件中读取端口号
            IPEndPoint ipep = new IPEndPoint(host.AddressList[0], DEFAULT_PORT);

            
//创建一个udp套接字
            Socket server = new Socket(AddressFamily.InterNetwork,
                SocketType.Dgram, ProtocolType.Udp);

            
if(msg.Length != 0)
            
{
                data 
= Encoding.Unicode.GetBytes(msg);
                
try
                
{
                    server.SendTo(data, data.Length, SocketFlags.None, ipep);
                }

                
catch(SocketException){}
                
finally
                
{
                    server.Close();
                }


            }


        }


        
//接受消息方法
        public static string ReceiveMessage()
        
{
            
int recv;
            
byte[] data = new byte[1024];

            
//创建一个随机终结点对象
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, DEFAULT_PORT);

            
//创建一个Udp套接字
            Socket newsock = new Socket(
                AddressFamily.InterNetwork,SocketType.Dgram,    ProtocolType.Udp);

            
//将随机终结点与Udp套接字绑定,以等待流入的数据包
            newsock.Bind(ipep);

            
//创建一个接受任意发送者的终结点
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint tmpRemote 
= (EndPoint)(sender);

            
try
            
{
                recv 
= newsock.ReceiveFrom(data, ref tmpRemote);
                
return Encoding.Unicode.GetString(data,0,data.Length);
            }

            
catch(SocketException)
            
{
                
return null;
            }

            
finally
            
{
                newsock.Close();
//关闭套接字释放资源
            }


        }


    }

}
posted @ 2010-06-30 00:10  河塘月色  阅读(250)  评论(0编辑  收藏  举报