この質問をするのも恥ずかしいですが、グーグルで徹底的に検索した後(MSDNを使い始めました...)、投稿することにしました:
ちょうど今、クライアント サーバー プログラミング (C# を使用) の学習を開始し、tcpClient を使用して最初のコードを記述しようとしています。サーバー側とクライアント側の両方を書いています。これが私の質問です。常に、クライアントは 1 つの String をサーバーに送信し、サーバーは String をクライアントに送り返します。サーバーは 2 つの文字列を続けて送信できませんか? 彼はクライアントの応答を待つ必要がありますか? これはクライアントサーバーの原則ですか??
繰り返しますが、お粗末な質問で申し訳ありません。ありがとう...
<> 私のコードの一部 (長いコード...) を投稿してみます。冗長な部分を切り取ろうとしたので、コードが意味をなすことを願っています... (主な問題を//************でマークしました)
public class MServer2
{
Dictionary<String, String> nameAndPass = new Dictionary<String, String>();
Dictionary<String, List<String> > nameAndMail = new Dictionary<String, List<String>>();
public static void Main()
{
new MServer2();
}
public MServer2()
{
TcpListener server = new TcpListener(8500);
try
{
server.Start();
Console.WriteLine("started " + server);
while (true)
{
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("connection accepted " + client);
new Server1(client, nameAndPass, nameAndMail);
}
}
catch (Exception e)
{
Console.WriteLine("exception" + e);
}
finally
{
server.Stop();
}
}
class Server1
{
TcpClient client;
NetworkStream netStream;
Dictionary<String, String> nameAndPass1 = new Dictionary<String, String>();
Dictionary<String, List<String>> nameAndMail1 = new Dictionary<String, List<String>>();
internal Server1(TcpClient client, Dictionary<String, String> nameandPassFromFile, Dictionary<String, List<String> > nameAndMailsFromFile)
{
nameAndPass1 = nameandPassFromFile;
nameAndMail1 = nameAndMailsFromFile;
this.client = client;
Thread thr = new Thread(new ThreadStart(Run));
thr.Start();
}
public void Run()
{
try
{
netStream = client.GetStream();
StreamReader reader = new StreamReader(netStream);
StreamWriter writer = new StreamWriter(netStream);
writer.AutoFlush = true;
Console.WriteLine("beginning to receive loop");
writer.WriteLine("Choose your user name.");
strFromClient = reader.ReadLine();
userName = strFromClient;
writer.WriteLine("Choose your user password.");
strFromClient = reader.ReadLine();
password = strFromClient;
writer.WriteLine("Do you want to see the list of email addresses? (y/n)");
strFromClient = reader.ReadLine();
//***********************************************************************************
//HERE'S MY PROBLAM:
//HERE THE CLIENT WILL GET A STRING SHOWING HIS EMAILS, AND I WANT HIM TO GET ANOTHER STRING ASKING "Do you want to add an email address? (y/n)", BUT IT LOOKS LIKE THE SERVER "WAITS" FOR A RESPONSE FROM THE CLIENT TO SHOW THE NEXT STRING...
if (strFromClient == "y")
{
String tmpStr = null;
List<String> tmp = nameAndMail1[userName];
for(int i=0; i<nameAndMail1[userName].Count; i++)
{
tmpStr += tmp[i] + " ";
}
writer.WriteLine(tmpStr);
}
writer.WriteLine("Do you want to add an email address? (y/n)");
strFromClient = reader.ReadLine();
}
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
編集 VOL 2
わかった!2 時間の惨めさの後、Phil Frost (天才!) のおかげで問題を発見したと思います--- 問題はおそらくクライアントにあります... (Im soch a-hole!)。
サーバーは2つの文字列を連続して送信しますが、クライアント側の私の愚かな実装は、クライアントから送信されたメッセージに従わないメッセージ(サーバーから受信したメッセージ)を表示しません...
だからもう一度あなたの助けが必要です。クライアント フォームをどのように設計したかを次に示します。
私の経験不足により、「サーバーに接続」ボタンが押されたときにサーバーに接続し、「メッセージを送信」ボタンが押されたときにのみサーバーからのメッセージが表示されました。問題は、クライアントからサーバーにメッセージを送信せずに、サーバーから 2 つ (またはそれ以上) のメッセージを受信した場合です。クライアントは、新しいメッセージが受信されたことを認識していません! サーバーからのメッセージをどこで受信すると思いますか? (「where」は、たとえば、どの関数の下であるかを意味します-現在、sendMessage_click関数で発生します)。
これまでのすべてのヘルプにもう一度感謝します!!