Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接收到的数据C错误#_C#_Server - Fatal编程技术网

C# 接收到的数据C错误#

C# 接收到的数据C错误#,c#,server,C#,Server,为什么我收到这个:,当我发送这个 客户端应用程序的Cod: try { tcpclient.Connect("127.0.0.1", 80); String str = "LOG" + Login.Text + "$" + hasło.Text; Stream stm = tcpclient.GetStream(); ASCIIEncoding asen = new ASCIIEn

为什么我收到这个:,当我发送这个

客户端应用程序的Cod:

try
        {

            tcpclient.Connect("127.0.0.1", 80);

            String str = "LOG" + Login.Text + "$" + hasło.Text;
            Stream stm = tcpclient.GetStream();
            ASCIIEncoding asen = new ASCIIEncoding();
            byte[] buffer = asen.GetBytes(str);
            stm.Write(buffer, 0, buffer.Length);
  try
        {
            string msg = "";
            Socket socket = Listerner.AcceptSocket();
            ASCIIEncoding asen = new ASCIIEncoding();

            int x = socket.ReceiveBufferSize;
            byte[] buffor = new byte[x];
            int data = socket.Receive(buffor);
            string wiadomość = Encoding.ASCII.GetString(buffor);
主机的Cod:

try
        {

            tcpclient.Connect("127.0.0.1", 80);

            String str = "LOG" + Login.Text + "$" + hasło.Text;
            Stream stm = tcpclient.GetStream();
            ASCIIEncoding asen = new ASCIIEncoding();
            byte[] buffer = asen.GetBytes(str);
            stm.Write(buffer, 0, buffer.Length);
  try
        {
            string msg = "";
            Socket socket = Listerner.AcceptSocket();
            ASCIIEncoding asen = new ASCIIEncoding();

            int x = socket.ReceiveBufferSize;
            byte[] buffor = new byte[x];
            int data = socket.Receive(buffor);
            string wiadomość = Encoding.ASCII.GetString(buffor);

这是因为主机上的
buffer
变量具有固定大小,因此
Encoding.ASCII.GetString
将尝试将整个字节数组转换回字符串,而不管实际接收到多少字节

socket.Receive
返回实际接收的字节数。使用此信息还原字符串:

int bytesReceived = socket.Receive(buffor);
string wiadomość = Encoding.ASCII.GetString(buffor, 0, bytesReceived);
请参阅和以供参考

现在它应该适用于你的小例子。但请注意,您可能会收到比缓冲区一次可以占用的字节更多的字节。所以你必须做一些类似的事情:

string messageReceived = "";
int bytesReceived = 0;
do
{
    bytesReceived = socket.Receive(buffor)
    messageReceived += Encoding.ASCII.GetString(buffor, 0, bytesReceived);
} while(bytesReceived >= buffor.Length)
// now messageReceived should contain the whole text

因为
socket.receiveBufferSize
是缓冲区的大小,而不是数据的大小
int data
是您接收的字节数,可以与
ReceiveBufferSize
一样高,但在本例中,它较低,并且是您应该用于字节数组的大小。如果发送的字节数超过缓冲区中的字节数,则应重新读取,直到
int data
为0。请将发送和接收的字符串粘贴为文本,而不是图片。感谢第一个解决方案有效,但当手动尝试第二个解决方案时,它会冻结我的服务器。但我还有其他问题,为什么列表中有用户(ala,ala)我收到的是假的,如果使用相同的??如果(Users.Contains(newuserspabrow(login,password)),我的第一个解决方案会阻塞,因为Receive是一个阻塞调用。什么对您最有利实际上取决于主机程序的要求和设计。主机是否应保持连接打开,直到收到下一个数据?客户端会关闭连接吗?但这将远远超出你的问题,因此应该在另一个问题中讨论。我修改了代码,使其不再冻结。此外,对于评论中的下一个问题,您应该创建一个新问题。这里不是论坛。一个问题-一个答案。好的,就像端到端一样。收到响应后关闭。我无法发送新问题。就像我处理列表时遇到的问题一样,我使用了Exist,因为我不知道为什么Contains返回false,但这项工作。如果(Users.Exists(x=>x.RegisteredUser==login&&x.Pasword==password)){return true}