需要通过Socket对字节进行帮助
本文关键字:字节 帮助 Socket | 更新日期: 2023-09-27 17:50:39
我试图通过套接字发送几个数据,因此它被转换为字节,然后返回到服务器上的字符串。但显然我只能做一个。
服务器代码:
static void Read(IAsyncResult ar)
{
int fileNameLen = 1;
//int userNameLen = 9;
State newState = (State)ar.AsyncState; //gets state of Socket
Socket handler = newState.Socket_w; //passes Socket to handler
int bytesRead = handler.EndReceive(ar); //terminates Data Receive from Socket.
if (bytesRead > 0)
{
if (flag == 0)
{
fileNameLen = BitConverter.ToInt32(newState.buffer, 0); //gets filename length
fileName = Encoding.UTF8.GetString(newState.buffer, 4, fileNameLen); //gets filename
//userNameLen = BitConverter.ToInt32(newState.buffer, 8);
//getUsername = Encoding.UTF8.GetString(newState.buffer, 8, fileNameLen);
flag++;
}
}
}
客户机代码:
internal static void uploadFile(string host, string username, string getGame, string filename, string filepath)
{
byte[] m_clientData;
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] fileName = Encoding.UTF8.GetBytes(username + "_" + filename);
byte[] fileData = File.ReadAllBytes(filepath);
byte[] fileNameLen = BitConverter.GetBytes(fileName.Length);
//byte[] sendUsername = Encoding.UTF8.GetBytes(username);
//byte[] sendUsernameLen = BitConverter.GetBytes(sendUsername.Length);
//byte[] sendGame = Encoding.UTF8.GetBytes(getGame);
//byte[] sendGameLen = BitConverter.GetBytes(sendGame.Length);
m_clientData = new byte[4 + fileName.Length + fileData.Length];
fileNameLen.CopyTo(m_clientData, 0);
fileName.CopyTo(m_clientData, 4);
fileData.CopyTo(m_clientData, 4 + fileName.Length);
//sendUsernameLen.CopyTo(m_clientData, 0);
//sendUsername.CopyTo(m_clientData, 4);
//sendGameLen.CopyTo(m_clientData, 0);
//sendGame.CopyTo(m_clientData, 4);
clientSock.Connect(host, 8889);
clientSock.Send(m_clientData); //tofix exception
clientSock.Close();
}
我似乎无法在服务器上正确解密它。谁能帮我弄一下缓冲区大小之类的?
Read
不知道发送的内容;TCP基本上只是一个流-所以有绝对没有说你在一次调用Read
中拥有所有数据;你可以输入:
- 您发送的确切数据量
- 消息的一部分 <
- 17消息/gh>
- 一条消息的结束和下一条消息的开始
- 消息中的1个孤立字节
你需要设计某种帧协议,让接收者知道他们什么时候有完整的消息。这可以像长度前缀一样简单,也可以更复杂。然后应该在内存中缓冲数据(或逐步处理),直到获得整个消息。对Read
的一次调用非常不太可能表示单个完整的消息。实际上,如果消息大于您的newstate.buffer
,则保证不会出现这种情况,但是即使对于较小的消息和较大的缓冲区,也可以得到相同的结果。