C#.net XMLSocket 应用程序
Posted
技术标签:
【中文标题】C#.net XMLSocket 应用程序【英文标题】:C#.net XMLSocket app 【发布时间】:2011-05-11 11:40:59 【问题描述】:我正在尝试使用 XMLSocket 协议使 C#.net 应用程序连接到服务器,我可以使用以下 VB.net 代码来完成它,但我不确定如何在 C# 中完成它,因为我是刚刚学习了。
Public Sub connect(ByVal host As String, ByVal port As Integer)
Try
mobjClient = New TcpClient(host, port)
mobjClient.GetStream.BeginRead(marData, 0, 1024, AddressOf DoRead, Nothing)
DisplayText("Connected to " & host & " On port " & port)
Catch
MarkAsDisconnected("Connection error.")
End Try
End Sub
Public Sub Send(ByVal t As String, Optional ByVal disp As Boolean = True)
Try
Dim w As New IO.StreamWriter(mobjClient.GetStream)
w.Write(t & Chr(0))
w.Flush()
If disp = True Then
'DisplayText(t)
End If
Catch
DisplayText("Error Sending!")
End Try
End Sub
Private Sub DoRead(ByVal ar As IAsyncResult)
Dim intCount As Integer
Try
intCount = mobjClient.GetStream.EndRead(ar)
If intCount < 1 Then
'MarkAsDisconnected("Error reading Stream!")
DisplayText("Error reading stream.")
'Exit Sub
End If
BuildString(marData, 0, intCount)
mobjClient.GetStream.BeginRead(marData, 0, 1024, AddressOf DoRead, Nothing)
Catch e As Exception
MarkAsDisconnected("Reconnecting...")
connect("example.com", 7777)
LogIn("lograinbows", "inthesky", "DRESSLOGCASINO")
End Try
End Sub
''// This is important! Keep the Decoder and reuse it when you read this socket.
''// If you don't, a char split across two reads will break.
Dim decoder As Decoder = Encoding.UTF8.GetDecoder()
Private Sub BuildString(ByVal bytes() As Byte, ByVal offset As Integer, ByVal byteCount As Integer)
Try
''// Here's where the magic happens. The decoder converts bytes into chars.
''// But it remembers the final byte(s), and doesn't convert them,
''// until they form a complete char.
Dim chars(bytes.Length) As Char
Dim charCount As Integer = decoder.GetChars(bytes, offset, byteCount, chars, 0)
For i As Integer = 0 To charCount - 1
If chars(i) = Chr(0) Then ''// The fix for bullet #2
mobjText.Append(vbLf)
Dim params() As Object = mobjText.ToString
Me.Invoke(New DisplayInvoker(AddressOf Me.HandleXML), params)
''// You don't have to make a new StringBuilder, BTW -- just clear it.
mobjText.Length = 0
Else
mobjText.Append(chars(i))
End If
Next
Catch e As Exception
DisplayText("Error: ", e.Message)
End Try
End Sub
【问题讨论】:
我希望,为了您,代码中的登录信息不是您的真实登录信息。如果是:尽快更改密码! 嘿,在其中使用真实密码会很愚蠢。我喜欢假的。 【参考方案1】:您的所有代码都可以轻松转换为 C#。
如果您需要帮助,可以尝试使用自动转换器,如 this one 或提出更具体的问题。
提示:
Chr(0)
的 C# 等效项是 '\0'
。
params
是 C# 关键字;您需要重命名该变量。
【讨论】:
【参考方案2】:public void connect(string host, int port)
try
mobjClient = new TcpClient(host, port);
mobjClient.GetStream.BeginRead(marData, 0, 1024, DoRead, null);
DisplayText("Connected to " + host + " On port " + port);
catch
MarkAsDisconnected("Connection error.");
public void Send(string t, bool disp = true)
try
System.IO.StreamWriter w = new System.IO.StreamWriter(mobjClient.GetStream);
w.Write(t + Strings.Chr(0));
w.Flush();
if (disp == true)
//DisplayText(t)
catch
DisplayText("Error Sending!");
private void DoRead(IAsyncResult ar)
int intCount = 0;
try
intCount = mobjClient.GetStream.EndRead(ar);
if (intCount < 1)
//MarkAsDisconnected("Error reading Stream!")
DisplayText("Error reading stream.");
//Exit Sub
BuildString(marData, 0, intCount);
mobjClient.GetStream.BeginRead(marData, 0, 1024, DoRead, null);
catch (Exception e)
MarkAsDisconnected("Reconnecting...");
connect("xivio.com", 7777);
LogIn("lograinbows", "inthesky", "DRESSLOGCASINO");
//'// This is important! Keep the Decoder and reuse it when you read this socket.
//'// If you don't, a char split across two reads will break.
Decoder decoder = Encoding.UTF8.GetDecoder();
private void BuildString(byte[] bytes, int offset, int byteCount)
try
//'// Here's where the magic happens. The decoder converts bytes into chars.
//'// But it remembers the final byte(s), and doesn't convert them,
//'// until they form a complete char.
char[] chars = new char[bytes.Length + 1];
int charCount = decoder.GetChars(bytes, offset, byteCount, chars, 0);
for (int i = 0; i <= charCount - 1; i++)
//'// The fix for bullet #2
if (chars[i] == Strings.Chr(0))
mobjText.Append(Constants.vbLf);
object[] @params = mobjText.ToString ;
this.Invoke(new DisplayInvoker(this.HandleXML), @params);
//'// You don't have to make a new StringBuilder, BTW -- just clear it.
mobjText.Length = 0;
else
mobjText.Append(chars[i]);
catch (Exception e)
DisplayText("Error: ", e.Message);
我用过:http://www.developerfusion.com/tools/convert/vb-to-csharp/
【讨论】:
以上是关于C#.net XMLSocket 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
XMLSocket 在 Firefox 中工作,但不在 IE 中
Actionscript xmlsocket不读取nodejs网络模块服务器写入的数据。但服务器正确读取数据。任何解决方案