发送通知客户端

时间:2012-05-31 08:30:33

标签: c# .net web-services webmethod

我想通过调用另一个方法向订阅者发送通知(比如字符串)(订阅者ip地址在服务器端的数据库中)。当我调用该方法时,输出变为错误 -

[WebMethod]
public string GetGroupPath(string emailAddress, string password, string ipAddress)
{
    //SqlDataAdapter dbadapter = null;
    DataSet returnDS = new DataSet();
    string groupName = null;
    string groupPath = null;

    SqlConnection dbconn = new SqlConnection("Server = localhost;Database=server;User ID = admin;Password = password;Trusted_Connection=false;");

    dbconn.Open();

    SqlCommand cmd = new SqlCommand();
    string getGroupName = "select users.groupname from users where emailaddress = "+"'"+ emailAddress+"'"+ " and "+ "users.password = " + "'" +password+"'";
    cmd.CommandText = getGroupName;
    cmd.Connection = dbconn;
    SqlDataReader reader = null;
    try
    {
        reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            groupName = reader["groupname"].ToString();
        }
    }
    catch (Exception)
    {
        groupPath = "Invalied";
    }


    dbconn.Close();
    dbconn.Open();

    if (groupName != null)
    {
        string getPath = "select groups.grouppath from groups where groupname = " + "'" + groupName + "'";
        cmd.CommandText = getPath;
        cmd.Connection = dbconn;

        try
        {
            reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                groupPath = reader["grouppath"].ToString();
            }
        }
        catch
        {
            groupPath = "Invalied";
        }
    }
    else
        groupPath = "Invalied";
    dbconn.Close();


    if (groupPath != "Invalied") 
    {
        dbconn.Open();
        string getPath = "update users set users.ipaddress = "+"'"+ipAddress+"'"+" where users.emailaddress = " + "'" + emailAddress + "'";
        cmd.CommandText = getPath;
        cmd.Connection = dbconn; 
        cmd.ExecuteNonQuery();
        dbconn.Close();

    }

    NotifyUsers();
    //NotifyUsers nu = new NotifyUsers();
    //List<string> ipList = new List<string>();
    //ipList.Add("192.168.56.1");

    //nu.Notify();

    return groupPath;
}

private void NotifyUsers() 
{
    Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    byte[] ipb = Encoding.ASCII.GetBytes("255.255.255.255");
    IPAddress ipAddress = new IPAddress(ipb);

    IPEndPoint endPoint = new IPEndPoint(ipAddress, 15000);
    string notification = "new_update";
    byte[] sendBuffer = Encoding.ASCII.GetBytes(notification);
    sock.SendTo(sendBuffer, endPoint);
    sock.Close();  
}

这是必须基本完成的事情。在服务器端,我有一个监听线程,当服务器发送数据时它会收到通知(假设现在数据库包含客户端IP地址)。然后我调用web方法它会给出错误“无效的IPAddress”atline

byte[] ipb = Encoding.ASCII.GetBytes("255.255.255.255");

谢谢:)因为这是我的第一篇文章,请善意地给我一个更好的反馈:)  thaks

2 个答案:

答案 0 :(得分:1)

在禁用防火墙设置之前,请在通知中尝试以下代码...

try
{
    // Establish the remote endpoint for the socket.

    // This example uses port 11000 on the local computer.
    IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName())

    Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint remoteEP = new IPEndPoint(ipAddress,15000);
    string notification = "new_update";
    byte[] sendBuffer = Encoding.ASCII.GetBytes(notification);
    sock.SendTo(sendBuffer, remoteEP );
    sock.Close();  
}
catch() {}

希望这能解决问题。

答案 1 :(得分:1)

只想添加

byte[] ipb = Encoding.ASCII.GetBytes("255.255.255.255");
IPAddress ipAddress = new IPAddress(ipb);

可以缩减为

IPAddress.Broadcast

或者,如果您想使用其他IP地址,您也可以使用.Parse()

var ip = IPAddress.Parse("192.168.1.1");

<强>更新

实际上Encoding.ASCII.GetBytes("255.255.255.255");会给你一个完全不同的结果。

var bytes = Encoding.ASCII.GetBytes("255.255.255.255");

// bytes returns something like
// new byte[] { 50, 53, 53, 46... }

// what you want is
var bytes = new byte[] { 255, 255, 255, 255 };