I wanted to create apps like this:
User select dates in client up.
When he clicks send button client sends dates over TCP to server.
When server receives dates he process them and retuns to client csv in string.
When client receives he writes data to file.
Heres my code:
Servers part:
private void StartListen()
{
server.Start();
new Thread(() =>
{
client = server.AcceptTcpClient();
zapisiLog("klient se spojio");
if(client.Connected)
{
ServerReceive();
}
}).Start();
}
public void ServerReceive()
{
stream = client.GetStream();
new Thread(() =>
{
while((i = stream.Read(datalength, 0, 4)) != 0)
{
byte[] data = new byte[BitConverter.ToInt32(datalength, 0)];
stream.Read(data, 0, data.Length);
this.Invoke((MethodInvoker) delegate
{
String s = Encoding.Default.GetString(data);
string[] datumi = s.Split('_');
sd1 = datumi[0];
sd2 = datumi[1];
mstat = datumi[2];
DataSet dset = prikupi_podatke();
if(datumi[2] != "" & dset != null)
{
String zs = obradi(ref dset);
if(zs != "")
{
ServerSend(zs);
}
else
{
zapisiLog("Obrada podataka nije uspjela");
}
}
else
{
zapisiLog("Prikupljanje podataka nije uspjelo");
System.IO.StreamWriter sw = new System.IO.StreamWriter(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\codexExcel.log");
try
{
sw.WriteLine(DateTime.Now.ToString() + ";Prikupljanje podataka nije uspjelo");
sw.Close();
}
catch(Exception)
{
sw.Close();
}
}
});
}
}).Start();
}
Clients part:
public void spoji()
{
try
{
client = new TcpClient(ip, 1980);
ClientReceive();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public void ClientSend(string msg)
{
stream = client.GetStream();
byte[] data;
data = Encoding.Default.GetBytes(msg);
int length = data.Length;
byte[] datalength = new byte[4];
datalength = BitConverter.GetBytes(length);
stream.Write(datalength, 0, 4);
stream.Write(data, 0, data.Length);
}
public void ClientReceive()
{
string primljeno;
stream = client.GetStream();
new Thread(() =>
{
while((i = stream.Read(datalength, 0, 4)) != 0)
{
byte[] data = new byte[BitConverter.ToInt32(datalength, 0)];
stream.Read(data, 0, data.Length);
this.Invoke((MethodInvoker) delegate
{
primljeno = Encoding.UTF8.GetString(data);
if(primljeno != "")
{
obradi2(ref primljeno);
}
else
{
MessageBox.Show("Komunikacija nije uspjela");
}
});
}
}).Start();
}
Applications are working well when server and host are on same machine. But not stable on different machines. By not working well I mean app crash with "server is not responding". What am i doing wrong?