現在この問題があります。サーバーからのクライアントのダウンロードは1回目のみ正常に実行されます。 2回目は動作しません(何も起こりません、クラッシュはありません)。ここでは両方の側からのコード:C#tcpソケットクライアントはサーバからファイルをダウンロードします
私がダウンロードボタンをクリックすると、別のクラスloginFormからメソッドsendComment(文字列リクエスト)を呼び出します。
サーバでは、クライアントから文字列リクエストを受け取った後、サーバはsendComment(string listFiles)を呼び出します。 listFilesは、クライアントがダウンロードする必要があるすべてのファイルの名前とサイズで構成されます。
文字列listFiles形式: "commitRequest mName usID fiName1 fiSize1 fiName2 fiSize2 ..."この文字列を受け取った後、クライアントは文字列で各ファイルを要求します。
クライアント側:loginForm
:第1回ダウンロードボタンをクリックした後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);
}
}
、クライアントにダウンロードされたファイルが正常に、私はすべてのファイルがダウンロードされ、削除、その後、私はダウンロードボタン2回目にクリックしたが、今回はうまくいかなかった。
ファイルがダウンロードされませんでした。私はデバッグを試みましたが、エラーは表示されませんでしたが、クライアントアプリケーションは、サーバーから文字列listFilesを受け取るステップで停止しました。私はクライアントが文字列を再確認したことを意味します。サーバーは文字列を再確認しました。サーバーは文字列リストファイルを送信しました。クライアントは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
コードは読みにくいです。問題が残っている最小限の例に減らしてみてください。あなたはちょうど道に沿ってあなたの問題を解決するかもしれません:) –