В настоящее время у меня есть эта проблема. Клиент загружается с сервера только в первый раз. Второй раз он не работает (ничего не происходит, без сбоев). Здесь код с обеих сторон:C# tcp socket client загружает файлы с сервера
На клиенте в mainForm, если я нажму кнопку загрузки, я вызову метод sendComment (запрос строки) из другого класса, loginForm.
На сервере после получения запроса строки от клиента сервер будет вызывать sendComment (string listFiles). listFiles состоит из всех имен файлов и размеров, которые требуется загрузить клиенту.
Строка listFiles format: "commitRequest mName usID fiName1 fiSize1 fiName2 fiSize2 ...". После получения этой строки клиент будет запрашивать каждый файл в строке.
стороне клиента:
LoginForm:
private void Connect()
{
try
{
serversocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serversocket.Blocking = true;
IPHostEntry IPHost = Dns.Resolve(textBox1.Text);
string[] aliases = IPHost.Aliases;
IPAddress[] addr = IPHost.AddressList;
IPEndPoint ipepServer = new IPEndPoint(addr[0], 8090);
serversocket.Connect(ipepServer);
clientsock = serversocket;
Thread MainThread = new Thread(new ThreadStart(listenclient));
MainThread.Start();
MessageBox.Show("Connected successfully", "Infomation", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (SocketException se)
{
Console.WriteLine(se.Message);
}
catch (Exception eee)
{
MessageBox.Show("Socket Connect Error.\n\n" + eee.Message + "\nPossible Cause: Server Already running. Check the tasklist for running processes", "Startup Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
}
void listenclient()
{
Socket sock = clientsock;
string cmd = server;
byte[] sender = System.Text.Encoding.ASCII.GetBytes("CLIENT " + cmd);
sock.Send(sender, sender.Length, 0);
while (sock != null)
{
cmd = "";
byte[] recs = new byte[32767];
int rcount = sock.Receive(recs, recs.Length, 0);
string clientmessage = System.Text.Encoding.ASCII.GetString(recs);
clientmessage = clientmessage.Substring(0, rcount);
string smk = clientmessage;
cmdList = null;
cmdList = clientmessage.Split(' ');
string execmd = cmdList[0];
sender = null;
sender = new Byte[32767];
string parm1 = "";
if (execmd == "CommitRequest")
{
for (int i = 3; i < cmdList.Length - 1; i++)
{
if (i % 2 == 1)
{
sendComment("downloadFile " + cmdList[i]); // after receiving this, server will upload the file requested
downloadMFromServer(sock, cmdList[2], cmdList[1], cmdList[i], cmdList[i + 1]);
}
}
continue;
}
}
private void downloadMFromServer(Socket s, string userID, string mName, string fileN, string fileS)
{
Socket sock = s;
string rootDir;
rootDir = @"C:\Client Data" + "\\" + userID + "\\" + mName;
Directory.CreateDirectory(rootDir);
System.IO.FileStream fout = new System.IO.FileStream(rootDir + "\\" + fileN, FileMode.Create, FileAccess.Write);
NetworkStream nfs = new NetworkStream(sock);
long size = int.Parse(fileS);
long rby = 0;
try
{
while (rby < size)
{
byte[] buffer = new byte[1024];
int i = nfs.Read(buffer, 0, buffer.Length);
fout.Write(buffer, 0, (int)i);
rby = rby + i;
}
fout.Close();
}
catch (Exception ed)
{
Console.WriteLine("A Exception occured in file transfer" + ed.ToString());
MessageBox.Show(ed.Message);
}
}
После 1 загрузки кнопки мыши, файлы, загруженные к клиенту успешно, то я удалил все файлы загружены, а затем я нажал на кнопку загрузки 2-й раз, но на этот раз это не сработало.
Файлы не были загружены. Я пробовал отлаживать, он не показывал никаких ошибок, но клиентское приложение остановилось на шаге, получая строку listFiles с сервера. Я имею в виду клиентскую строку с подтверждением. сервер получил строку re ok. server sended string listFiles ok. но клиент не получал listFiles. Кто-нибудь знает, почему это не работает? Заранее благодарны за Вашу помощь.
Вот код метода sendComment, он одинаковый для клиентского и серверного приложений.
public void sendComment(string comment)
{
Socket serversock = serversocket;
if (serversock == null)
{
MessageBox.Show("Client not connected", "Connect Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
byte[] b = System.Text.Encoding.ASCII.GetBytes(comment + " ");
serversock.Send(b, b.Length, 0);
}
Я не загружать код на стороне сервера, потому что я не думаю, что есть какие-либо проблемы с ним, и этот пост будет немного долго, но если вам нужно просто сказать, и я отправлю его.
закрыть розетку? – Euclid
Что вы имеете в виду? Я не закрыл его на стороне клиента. И если я нажму на кнопку загрузки 2-го или 3-го раза, все равно будет то же самое. Сервер отправил строку fileList, но клиент ее не получил. – PeteMerry
Код просто больно читать. Попробуйте уменьшить его до минимального примера, который все еще имеет проблему. Вы можете просто решить свою проблему по пути :) –