Windows 8 用の IRC クライアント アプリを作成しようとしています。問題が発生しました。私は、この pytho のチュートリアルから始めました: http://oreilly.com/pub/h/1968 次のコードになります (python 3.3 の場合)。クライアントをシャットダウンするまで、なんとかサーバーに接続し、認識されてログオンします。
server = "irc.location.net"
from socket import *
def main():
s = socket(AF_INET, SOCK_STREAM)
s.connect((server, 6667))
readbuffer = ""
s.send("NICK testIRC\r\n".encode())
s.send("USER testIRC irc.location.net welcome :Test_IRC\r\n".encode())
while 1:
readbuffer = readbuffer + s.recv(1024).decode()
temp = readbuffer.split("\n")
readbuffer = temp.pop()
for line in temp:
line = line.rstrip();
tokens = line.split(' ');
if (tokens[0] == "PING"):
print("Got: %s\n" % line);
response = "PONG %s\r\n" % tokens[1];
s.send(response.encode())
print("Sending: %s\n\n" % response)
if __name__ == "__main__":
main();
次に、それを C# (.NET 4.5) に移植しようとしました。その結果を以下に示します。ただし、このコードは Python コードと同じ結果にはなりません。次のことが起こっている可能性があると思いますが、よくわかりません: サーバーがエンコーディングを認識していません (これは奇妙だと思います)。すべてをさらに奇妙にするために、キーのようなもの (何らかの 16 進値) を含む 1 つの ping を取得します。これにはもちろん、ポンで応答します。その最初の ping の後、何も受信しません。また、ユーザー リストにも表示されません。しかし、エンコーディングの問題以外は、何も考えられません。私のコードのエラーを見つけることができますか? よろしくお願いします。
StreamSocket ss = new StreamSocket();
await ss.ConnectAsync(new HostName(server_address), 6667.ToString());
DataWriter dw = new DataWriter(ss.OutputStream);
DataReader dr = new DataReader(ss.InputStream);
dr.InputStreamOptions = InputStreamOptions.Partial;
// Text related stuff
byte[] bytes;
// register
bytes = enc.GetBytes("NICK testIRC\r\n"); // enc is of type Encoding and is created as an UTF8Encoding.
dw.WriteBytes(bytes);
bytes = enc.GetBytes("USER testIRC irc.location.net welcome :Test_IRC\r\n");
dw.WriteBytes(bytes);
await dw.StoreAsync();
await dw.FlushAsync();
int ping_count = 0;
while (true)
{
await dr.LoadAsync(512);
string msg = dr.ReadString(dr.UnconsumedBufferLength);
string[] lines = msg.Split(new string[]{"\n"}, StringSplitOptions.RemoveEmptyEntries);
foreach(string line in lines)
{
string cmd = line.TrimEnd('\r');
if (cmd.StartsWith("PING "))
{
ping_count++;
string[] tokens = cmd.Split(' ');
// Create response
string response = "PONG " + tokens[1];
bytes = enc.GetBytes(response);
dw.WriteBytes(bytes);
dw.StoreAsync();
dw.FlushAsync();
}
}
}