[英]Stream for sending byte-arrays and strings (for network)
我正在搜索一個包含以下內容的Streamclass:-用於發送/接收字節數組的方法-用於發送/接收字符串的方法
我發現的唯一類是NetworkStream。 但是NetworkStream-Class的缺點是,如果我要發送字符串,我必須將其轉換為字節數組並發送此字節數組,因為沒有直接發送字符串的方法。 另一方面,像Streamwriter這樣的類具有發送/接收字符串的方法,但沒有發送/接收字節數組的方法。
如果我嘗試將這兩個Streamclass結合起來,如下所示:
TcpClient clientConnection = new TcpClient();
NetworkStream nws = clientConnection.GetStream();
StreamWriter sw = new StreamWriter(nws);
sw.writeLine("ABC");
sw.Flush();
nws.Write(byteArray, 0, lengthToSend);
我收到很多奇怪的錯誤(例如byteArray不會完全在另一端接收),因為我在這里以兩種不同的方式使用相同的一個流。
因此,我必須為計划使用NetworkStream-Class還是存在更好的方法?
我遇到了同樣的問題,關鍵是另一端不知道您要發送的字節數組或字符串是什么,所以我所做的就是為每個味精添加一個標題,特別是在處理嚴重的服務器/客戶端應用程序時,您將擁有多個數據(用戶信息,請求信息,回復信息等)
我正在使用Streamwriter發送和StreamReader進行接收,但是我也在使用線程,只要客戶端已連接,連接就保持打開狀態,所以我一次聲明它們
這是我的代碼的完整示例
public class Client
{
private StreamWriter swSender;
private StreamReader srReceiver;
private TcpClient tcpServer;
private Thread thrMessaging;
private string UserName = "UK";
private byte Tries = 0;
private bool Connected = false;
public void Connect()
{
if (!Connected)
{
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
string User = localIPs[0].ToString();
string ServIP = "127.0.0.1";//change this to your server ip
InitializeConnection(ServIP, User);
}
else
{
CloseConnection("Disconnected at user's request.");
}
}
private void InitializeConnection(string ServIp, string User)
{
IPAddress ipAddr = IPAddress.Parse(ServIp);
tcpServer = new TcpClient();
try
{
tcpServer.Connect(ipAddr, 1986);//change that 1986 to your server port
}
catch
{
if (Connected) CloseConnection("");
MessageBox.Show("Connecteing to " + ServIp + "\r\nServer is Down ... Try nomber " + Tries); return;
}
Connected = true;
UserName = User;
swSender = new StreamWriter(tcpServer.GetStream());
swSender.WriteLine(User);
swSender.Flush();
thrMessaging = new Thread(new ThreadStart(ReceiveMessages));
thrMessaging.Start();
}
private void ReceiveMessages()
{
srReceiver = new StreamReader(tcpServer.GetStream());
string ConResponse = srReceiver.ReadLine();
if (ConResponse[0] == '1')
{
}
else
{
string Reason = "Not Connected: ";
Reason += ConResponse.Substring(2, ConResponse.Length - 2);
return;
}
while (Connected)
{
try
{
string NewMsg = srReceiver.ReadLine();
if (NewMsg != null && NewMsg != "")
PacketHandler.HandlePacket(NewMsg, this);
}
catch { }
}
}
public void CloseConnection(string Reason)
{
try
{
Connected = false;
swSender.Close();
srReceiver.Close();
tcpServer.Close();
}
catch { }
}
public void SendMessage(string Msg)
{
if (Msg.Length >= 1)
{
try
{
Tries++;
swSender.WriteLine(Msg);
swSender.Flush();
Tries = 0;
}
catch
{
if (Tries < 5)
{
try
{
CloseConnection("No connection made");
Connect();
}
catch { }
SendMessage(Msg);
}
else { MessageBox.Show("Connecting to server faild for 5 tries"); Tries = 0; }
}
}
}
然后在數據包處理程序中,我進行處理以檢查客戶端收到的數據類型
像這樣的東西
public static void HandlePacket(string MsgRec, Client Client)
{
string[] Info = MsgRec.Split('|');
string Type = Info[0];
if (Type == "")
{
return;
}
string subtype = Info[1];
int TLen = Type.Length + subtype.Length + 2;
string Data = MsgRec.Remove(0, TLen);//this is the main data the server sent
ushort PacketType = ushort.Parse(Type);
ushort SubType = ushort.Parse(subtype);
switch ((Structs.PacketType)PacketType)
{
case Structs.PacketType.Login:
{
//do your stuff here
break
}
case Structs.PacketType.Image:
{
//convert the Data back to byte array then get the image out from it
break
}
case Structs.PacketType.ByteArray:
{
//convert the Data back to byte array
break
}
}
}
我知道它有點雜亂而不是完美的方式,但是它對我有用,並且請記住,在發送內容時,在另一端,您需要添加數據包類型和子類型,或者如果要添加內容,則只需添加帶有拆分器的任何標頭簡單
最后:我認為如果您要發送長度很小的數據包,則使用套接字和數據包會容易得多
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.