У меня возникают проблемы с этой частью кода. На самом деле я хочу установить приложение Client/Server. В клиентской части я запускаю Thread, функция которой проверяется только каждый раз, если она подключена к серверу (если соединение с сервером все еще установлено) TraceLog - это класс, который использует свой метод Info() для записи в файл. это является код клиента:C# Соединение с клиентом/сервером Thread
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;
namespace ClientApp
{
class ClientOpenConnection
{
private static Thread threadConnect;
static TcpClient myClient = new TcpClient();
static String host = "";
static Int32 port = 0;
//Function that makes the client runs
public static void RunClient(String hostname, Int32 hostport)
{
host = hostname;
port = hostport;
int _tryAgain = 0;
while (!myClient.Connected) {
try
{ //I start the connection
myClient.Connect(host, port);
}
catch {
}
_tryAgain += 10;
if (_tryAgain == 1000)
break;
//_tryAgain allows me to define how long will the client try to connect to the server.
}
TraceLog.Info("Out of the while ", ""); // This is to know where am I
if (_tryAgain != 1000)
{ //If I get out because _tryAgain is less than 1000. It means that I am already connected to the server
//Here I start a Thread to be sure that I am always connected to the server
threadConnect = new Thread(isConnected);
threadConnect.Start();
TraceLog.Info("Launch the thread","");
}
//While threadConnect is executing parallely I continue my program
}
private static void isConnected() {
//I keep my eyes on the network connection
while (myClient.Connected) {
//Nothing is done
}
TraceLog.Info("The connection has been lost","");
RunClient(host,port);
}
}
}
Проблема, которую я имею, когда я начинаю клиента до сервера я ввожу первый цикл WHILE. это нормально на этом уровне. , и когда я запускаю сервер после, я запускаю threadConnect, но проблема в том, что если теперь я остановлю сервер, обычно я должен иметь внутри файла журнала «Соединение было потеряно», но у меня ничего нет. Что не так с этой частью кода? Вы уже делали что-то подобное в прошлом?
Я пришел с модификацией, но все еще имею проблему для получения того, что хочу, т.е. клиент все еще пытается связаться с сервером eveytime, даже если сервер остановлен.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.IO;
namespace ClientApp
{
class ClientOpenConnection
{
private static Thread threadConnect;
static TcpClient myClient = new TcpClient();
static String host = "";
static Int32 port = 0;
//Function that makes the client runs
public static void RunClient(String hostname, Int32 hostport)
{
host = hostname;
port = hostport;
TraceLog.Info(" -> "+myClient.Connected,"");
while (!myClient.Connected) {
try
{
myClient.Connect(host, port);
TraceLog.Info(" <-> " + myClient.Connected, "");
}
catch {
TraceLog.Info("Trying to contact the server","");
}
}
TraceLog.Info("I am connected ", "");
//Here I start a Thread to be sure that I am always connected to the server
threadConnect = new Thread(isConnected);
threadConnect.Start();
TraceLog.Info("Launch the thread to be sure I am constantly online","");
}
private static void isConnected() {
//I keep my eyes on the network connection
TraceLog.Info("->>"+myClient.Connected,"");
while (myClient.Connected) {
Thread.Sleep(500);
try
{
NetworkStream stream = myClient.GetStream();
ASCIIEncoding ascii = new ASCIIEncoding();
byte[] _incomingMsg = new byte[1024];
stream.Read(_incomingMsg, 0, _incomingMsg.Length);
String strToGet = System.Text.Encoding.ASCII.GetString(_incomingMsg);
strToGet = strToGet.Trim();
if (!strToGet.Equals("ONLINE"))
if (strToGet.Equals(""))
{
TraceLog.Info("The message receive is empty","");
break;
}
}
catch {
break;
}
}
TraceLog.Info("The connection has been lost", "");
RunClient(host, port);
}
}
}
Но когда я называю RunClient() в IsConnected() функцию он выполняет в WHILE и выходе TraceLog.Info ("Попытка связаться с сервером", "");, даже если я снова запустил сервер, клиент остается в цикле while и никогда не подключается вообще.
в то время как (myClient.Connected) { // Ничего не делается } в этом коде не вставить Thead.Sleep (0) или больше - это нить работает Удерживание и никогда не выйти из – ctescu
время преобразования в то время (myclient.Connected) {Thread.Sleep (0);} – ctescu