Windows Phone 8.1 IRC
问题描述:
我一直在试图为我的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工作?
答
这里去!
大量的研究后,这是我发现:
首先我们得到了一个连接方法。
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你可以调用这是真的,这条河将在事后处理。
您的项目是Windows Phone 8.1 Runtime(通用应用程序)或Windows 8.1 silverlight? – crea7or 2014-11-22 23:29:07
我找到了一个解决方案,只要我为它写了一个类,我就会更新这篇文章:)感谢您对此感兴趣。是的,它是运行时间:) – Jazerix 2014-11-23 01:22:24