C# Windows Phone 8.1 IRC

C# Windows Phone 8.1 IRC,c#,sockets,windows-phone-8.1,irc,C#,Sockets,Windows Phone 8.1,Irc,我一直在尝试为我的WindowsPhone8.1应用程序制作一个IRC客户端,我很幸运地找到了一个非常好的教程。不幸的是,本教程是针对WP 7的,从WP 8.1起,MS将其更改为运行时应用程序,这意味着SocketAsyncEvents对我不可用(尽管MSDN表示它支持Windows Phone 8.1) 我四处寻找,发现这些套接字被移动到了Windows.Networking.sockets,但没有一个包含SocketAsyncEvents 我几乎无法再继续下去了,有人知道如何将上述函数转换为

我一直在尝试为我的WindowsPhone8.1应用程序制作一个IRC客户端,我很幸运地找到了一个非常好的教程。不幸的是,本教程是针对WP 7的,从WP 8.1起,MS将其更改为运行时应用程序,这意味着
SocketAsyncEvents
对我不可用(尽管MSDN表示它支持Windows Phone 8.1)

我四处寻找,发现这些套接字被移动到了Windows.Networking.sockets,但没有一个包含
SocketAsyncEvents

我几乎无法再继续下去了,有人知道如何将上述函数转换为可与WP 8.1一起使用的功能吗

经过大量研究,我发现:

首先,我们得到了一个连接方法

private readonly StreamSocket _clientSocket;
private bool _connected;
private DataReader _dataReader;
public string Hostname {
    get;
    set;
}
public int Port {
    get;
    set;
}
public Credentials Credentials;
public readonly string Channel;

public async Task < bool > Connect() {
    if (_connected) return false;
    var hostname = new HostName(Hostname);
    await _clientSocket.ConnectAsync(hostname, Port.ToString());
    _connected = true;
    _dataReader = new DataReader(_clientSocket.InputStream) {
        InputStreamOptions = InputStreamOptions.Partial
    };
    ReadData();
    return true;

}
现在我们有两个新方法,
SendIdentity()
应答(字符串消息)
通常IRC服务器会对您进行ping,在这里您必须用pong回复,如下所示:

private void ReplyPong(string message) {
    var pingCode = Regex.Match(message, "[0-9]+");
    SendRawMessage("PONG :" + pingCode);
}
private void SendIdentity() {
    if (Credentials.Nickname == string.Empty) Credentials.Nickname = Credentials.Username;
    SendRawMessage("NICK " + Credentials.Nickname);
    SendRawMessage("USER " + Credentials.Username + " " + Credentials.Username + " " + Credentials.Username + " :" + Credentials.Username);
    if (Credentials.Password != String.Empty) SendRawMessage("PASS " + Credentials.Password);
}
public class Credentials {
    public string Nickname {
        get;
        set;
    }
    public string Username {
        get;
        set;
    }
    public string Password {
        get;
        set;
    }

    public Credentials(string username, string password = "", string nickname = "") {
        Username = username;
        Password = password;
        Nickname = nickname;
    }
}
当服务器准备就绪时,我们还必须发送我们的身份,如下所示:

private void ReplyPong(string message) {
    var pingCode = Regex.Match(message, "[0-9]+");
    SendRawMessage("PONG :" + pingCode);
}
private void SendIdentity() {
    if (Credentials.Nickname == string.Empty) Credentials.Nickname = Credentials.Username;
    SendRawMessage("NICK " + Credentials.Nickname);
    SendRawMessage("USER " + Credentials.Username + " " + Credentials.Username + " " + Credentials.Username + " :" + Credentials.Username);
    if (Credentials.Password != String.Empty) SendRawMessage("PASS " + Credentials.Password);
}
public class Credentials {
    public string Nickname {
        get;
        set;
    }
    public string Username {
        get;
        set;
    }
    public string Password {
        get;
        set;
    }

    public Credentials(string username, string password = "", string nickname = "") {
        Username = username;
        Password = password;
        Nickname = nickname;
    }
}
最后我们有了
SendRawMessage()方法,该方法将数据发送到服务器

async private void SendRawMessage(string message) {
    var writer = new DataWriter(_clientSocket.OutputStream);
    writer.WriteString(message + "\r\n");
    await writer.StoreAsync();
    await writer.FlushAsync();
    writer.DetachStream();
    if (!_closing) return;
    _clientSocket.DisposeSafe();
    _connected = false;
}
几乎忘记了dispose函数,您可以在想要关闭流时调用它:)


这将发送最后一条消息,指示我们将离开,因为“现在关闭”是真的,所以流将在以后处理。

您的项目是Windows Phone 8.1 Runtime(universal app)或Windows 8.1 silverlight?我找到了一个解决方案,我一写完课程就会更新这篇文章:)谢谢你的关注。是的,它是运行时:)
public void Dispose()
{
     SendRawMessage("QUIT :");
     _closing = true;
}