2014-11-21 221 views
5

我一直在试图为我的Windows Phone 8.1应用程序创建一个IRC客户端,我很幸运地找到一个非常好的教程。不幸的是,教程是WP 7和WP 8.1 MS更改为运行时应用程序,这意味着SocketAsyncEvents不可用(即使MSDN表示它支持Windows Phone 8.1)。Windows Phone 8.1 IRC

public void SendToServer(string message) 
{ 
    var asyncEvent = new SocketAsyncEventArgs { RemoteEndPoint = new DnsEndPoint(server, serverPort) }; 

    var buffer = Encoding.UTF8.GetBytes(message + Environment.NewLine); 
    asyncEvent.SetBuffer(buffer, 0, buffer.Length); 

    connection.SendAsync(asyncEvent); 
} 

周围挖我发现插口被转移到Windows.Networking.Sockets,但仍没有一个包含SocketAsyncEvents

我几乎无法离开这里,有没有人有一个想法,如何将所述功能转换为可与WP 8.1工作?

+0

您的项目是Windows Phone 8.1 Runtime(通用应用程序)或Windows 8.1 silverlight? – crea7or 2014-11-22 23:29:07

+0

我找到了一个解决方案,只要我为它写了一个类,我就会更新这篇文章:)感谢您对此感兴趣。是的,它是运行时间:) – Jazerix 2014-11-23 01:22:24

回答

4

这里去!

大量的研究后,这是我发现:

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

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; 

} 

要阅读我们通过StreamSocket接收到的数据,我们创建了一个READDATA()方法,使之递归因此我们将继续得到数据:

async private void ReadData() { 
    if (!_connected || _clientSocket == null) return; 
    uint s = await _dataReader.LoadAsync(2048); 
    string data = _dataReader.ReadString(s); 
    if (data.Contains("No ident response")) SendIdentity(); 
    if (Regex.IsMatch(data, "PING :[0-9]+\\r\\n")) ReplyPong(data); 
    ReadData(); 
} 

现在我们有两个新方法,SendIdentity();ReplyPong(string message); 通常IRC服务器将平你,这里你有一个乒乓球回复,就像这样:

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; 
} 

差点忘了处置功能,当你想关闭该流:)

public void Dispose() 
{ 
    SendRawMessage("QUIT :"); 
    _closing = true; 
} 

这将发送指示最后的消息,我们要走了,既然现在_closing你可以调用这是真的,这条河将在事后处理。