我正在一个项目中,我需要向服务器发送请求,然后让服务器使用基于请求的数据(以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的新内容。
答案 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:这次我已经解决了这个问题(并确认了),我还有其他东西在监听数据,并且数据一直在那儿