我的客户机/服务器程序彼此很好地工作,但只有当服务器在我的客户端启动之前启动并运行时才能正常工作。如果客户端在第一次尝试时未能连接,我无法让它再次尝试。
这是我客户的connect方法。
public void connect()
{
IPAddress server_address = IPAddress.Parse("127.0.0.1");
IPEndPoint server_ip = new IPEndPoint(server_address, 5685);
Console.WriteLine("2");
bool connected = false;
while (!connected)
{
try
{
Console.WriteLine("IN CONNECTED");
udp_client.Connect(server_ip);
byte[] send_data = Encoding.ASCII.GetBytes("INIT");
udp_client.Send(send_data, send_data.Length);
byte[] received_bytes = udp_client.Receive(ref server_ip);
string received_data = Encoding.ASCII.GetString(received_bytes);
if (received_data == "INIT")
{
connected = true;
Console.WriteLine("RECEIVED INIT");
listen(server_ip);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}我希望看到的是udp_client.Connect(server_ip)循环,直到我收到来自服务器的"INIT“消息。
按照目前的情况,不存在循环。它似乎被困在udp_client.Receive(ref server_ip)上了。
任何帮助都将不胜感激!
发布于 2016-10-05 14:58:14
这是pseudoCode --您必须将一些东西移到类范围以允许将来的发送/接收(您将使用不同的方法)。这只是为了向您展示如何在连接阻塞时进行连接:
bool isClientConnected = false;
var connector = new System.ComponentModel.BackgroundWorker();
public void connectToUDP(){
connector.DoWork+= connect;
connector.RunWorkerAsync();
}
private void connect(object sender, DoWorkEventArgs e)
{
IPAddress server_address = IPAddress.Parse("127.0.0.1");
IPEndPoint server_ip = new IPEndPoint(server_address, 5685);
Console.WriteLine("2");
try
{
Console.WriteLine("Waiting for server...");
udp_client.Connect(server_ip);
byte[] send_data = Encoding.ASCII.GetBytes("INIT");
udp_client.Send(send_data, send_data.Length);
byte[] received_bytes = udp_client.Receive(ref server_ip);
string received_data = Encoding.ASCII.GetString(received_bytes);
if (received_data == "INIT")
{
isClietConnected = true;
Console.WriteLine("now connected");
listen(server_ip);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
public bool sendReceiveUDP(string send){
if(!isClientConnected){
return false;
}
//perform send
return true;
}然后使用类作用域维护连接的会话,并使用不同的方法发送/接收。这只是为了连接,因为你只需要做一次。
你如何设置这样的东西:
private bool isConnected = false();
private bool send(){
if(!isConnected){
connect();
}
//send
}
private bool connect(){
if(!isConnected){
//launch connection thread
}
}
private delegate void onNewReceive(string message);
public event onNewReceive onNewReceiveEvent;
public void fireEvent(string message){
onNewReceiveEvent.Invoke(message);
}
private void waitForData(object sender, DoWorkEventArgs e){
//this is the backgroundworker
while(true){
receive();
fireEvent(message);
}
}然后,在另一个类中订阅onNewREceivedEvent并处理入站消息。onNewReceivedEvent += processInboundMEsasage();
这些都是psuedocode和“脑编译”(对其他人来说是creit),所以它只用于演示。没有智慧,我就迷失了。
https://stackoverflow.com/questions/39876960
复制相似问题