2014-11-21 23 views
5

Ich habe versucht, einen IRC-Client für meine Windows Phone 8.1 App zu erstellen, und ich hatte das Glück, ein wirklich gutes Tutorial zu finden. Leider war das Tutorial für WP 7 und ab WP 8.1 MS änderte es zu Runtime-Apps, was bedeutet, dass SocketAsyncEvents für mich nicht verfügbar ist (obwohl MSDN sagt, dass es Windows Phone 8.1 unterstützt).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); 
} 

Graben um ich, dass die Steckdosen gefunden wurden Windows.Networking.Sockets bewegt, aber noch keiner von ihnen SocketAsyncEvents enthalten.

Ich kann von hier aus kaum weiter kommen, hat irgendjemand eine Idee, wie man diese Funktion in etwas umwandeln kann, das mit WP 8.1 funktionieren würde?

+0

Ihr Projekt ist Windows Phone 8.1 Runtime (Universal-App) oder Windows 8.1 Silverlight? – crea7or

+0

Ich habe eine Lösung gefunden, ich werde diesen Beitrag aktualisieren, sobald ich damit fertig bin, eine Klasse dafür zu schreiben :) Danke, dass du dich interessiert hast. Und ja, es ist Laufzeit :) – Jazerix

Antwort

4

Hier geht!

Nach viel Forschung ist das, was ich gefunden:

allererst wir eine Methode connect bekam.

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; 

} 

die Daten lesen wir durch die StreamSocket erhalten, schaffen wir eine Readdata() -Methode und es rekursiv machen, so werden wir die Daten erhalten:

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

Jetzt haben wir zwei neue Methoden , SendIdentity(); und ReplyPong(string message); Normalerweise ist der IRC-Server werden Sie ping, hier muss man mit einem Tennis antworten, etwa so:

private void ReplyPong(string message) { 
    var pingCode = Regex.Match(message, "[0-9]+"); 
    SendRawMessage("PONG :" + pingCode); 
} 

und wir auch haben unsere Identität zu senden, wenn der Server für sie bereit ist, etwa so:

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

Endlich haben wir unsere SendRawMessage(); Methode, die Daten an den Server sendet.

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

fast vergessen dispose Funktion aus, die Sie anrufen können, wenn Sie den Stream schließen möchten :)

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

Dies zeigt eine letzte Nachricht senden, dass wir gehen, und jetzt, da _closing ist wahr, der Strom wird danach entsorgt.

Verwandte Themen