服务器已发送数据后未发送数据

时间:2018-07-31 18:53:04

标签: c# tcp

我正在一个项目中,我需要向服务器发送请求,然后让服务器使用基于请求的数据(以JSON格式)答复,这是可行的,除了在第一次答复之后它没有。再次回复,我在客户端和服务器上使用SimpleTcp。 (我不确定服务器是否在发送答复,或者客户端是否只是在不接受答复,我真的不知道该怎么讲)

这是客户端代码:

public TType GetReply<TType>()
    { 
        var requestJson = this.ToJson(); // 'this' is the request class which holds the request information and data
        var reply = Client.client.WriteLineAndGetReply(requestJson, TimeSpan.FromSeconds(10));

        while (reply == null)
        {
            Debug.WriteLine("Waiting for not null");
        }

        while (string.IsNullOrEmpty(reply.MessageString))
        {
            Debug.WriteLine("WAITING");
        }
        var str = reply.MessageString.Substring(0, reply.MessageString.Length - 1); // SimpleTcp adds a delimiter by default, this is to remove it
        Debug.WriteLine("JSON: " + str);
        var data = (JObject)JsonConvert.DeserializeObject<RequestReply>(str).RequestedData;

        return data.ToObject<TType>();
    }

这是服务器代码:

static void HandleIncomingData(Message e)
    {
        string reply = "";
        var formattedData = e.MessageString.Substring(0, e.MessageString.Length - 1); // SimpleTcp adds a delimiter by default, this is to remove it
        var data = JsonConvert.DeserializeObject<Request>(formattedData);

        Console.WriteLine(formattedData);
        Console.WriteLine($"'{data.RequestValues["request"]}' Request");

        switch (data.RequestValues["request"].ToString())
        {
            default:
                reply = CommandHandler.HandleDBRequest(data.RequestValues).ToJson();
                break;

            case "EnterRoom":
                server.ConnectedUsers.Add(new ConnectedUser(e.TcpClient, (int)(long)data.RequestValues["id"]));
                Console.WriteLine($"Client Connected in Room [{data.RequestValues["id"]}] || {e.TcpClient.Ip()}");
                break;  
        }

        Console.WriteLine(reply);
        Console.WriteLine(data.Reply);
        if (data.Reply) e.ReplyLine(reply); // Not sending more than 1 reply
    }

只有几点注意事项:

data.RequestValues是保存请求数据的字典(例如,如果是登录请求,则将包含电子邮件和密码)

data.Reply是一个笨拙的检查服务器是否应回复请求的方法(我确认在不回复的情况下是真的)

在某些情况下,我使用JsonConvert而不是.ToJson();.FromJson();的原因只是出于测试目的,而我忘记将其改回。

对不起,如果我提供任何信息,这是stackoverflow的新内容。

2 个答案:

答案 0 :(得分:0)

您的代码是否正确处理了通讯协议?

例如,从服务器接收到信息后,服务器是否在等待您确认您已获得数据?

如果您要使用C#构建自己的客户端和服务器,那么可以看看我在2010年10月15日发表的一篇旧文章中,我在C中使用Vigenere Cipher编写了一个客户端和服务器:{{ 3}}

如果看一下代码,您会发现实现了整个通信协议:

#define CODE_FAIL                           '0FAIL'
#define CODE_OK                             '1OK'

#define CODE_HELLO                      '100HELLO'
#define CODE_WELCOME                    '101WELCOME'
#define CODE_REQ_SERVER_NAME    '102REQ_SERVER_NAME'

#define CODE_MSG                            '200MSG'

#define CODE_DATA                           '300DATA'
#define CODE_EOF                            '301EOF'
#define CODE_PUT                          '302PUT'
#define CODE_REQUEST_FILENAME   '303REQ_FILENAME'
#define CODE_REQUEST_ENCRYPT  '304REQ_ENCRYPT'
#define CODE_ENCRYPT                    '305ENCRYPT'
#define CODE_REQUEST_FILE     '306REQUEST_FILE'


#define CODE_CMD                            '400CMD'
#define CODE_LS                             '401LS'

#define CODE_ERROR            '500ERROR'
#define CODE_ERROR_LS                   '501ERROR_LS'
#define CODE_ERROR_CREAT_FILE '502ERROR_CREAT_FILE'

#define CODE_EXIT                           '600EXIT'

因此,如果您正在等待来自服务器的更多信息而又没有得到它,则意味着您应该发送一些信息以告知服务器继续向您发送信息。

答案 1 :(得分:0)

我发现了这个问题,但我没有意识到这是异步的,因此它说它在实际到达之前就已经获取了数据,这引起了一些问题,现在使其可以正常工作!

编辑:似乎它还没有解决问题,我仍然只从服务器收到1条回复。

EDIT2:这次我已经解决了这个问题(并确认了),我还有其他东西在监听数据,并且数据一直在那儿