很不好意思,我要问这个问题,但是在谷歌上搜索了很久(甚至去看MSDN),我决定发帖问一下:
我刚开始学习客户端-服务器编程(使用C#),并尝试着使用tcpClient编写我的第一个代码。我同时编写了服务器端和客户端。
我的问题是:客户端不断地向服务器发送一个字符串,然后服务器回复一个字符串给客户端,如此反复。但是,服务器不能连续发送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);
}
编辑第二版
好的!经过两个小时的痛苦,我认为我在Phil Frost(天才!)的帮助下找到了问题 --- 问题可能出在客户端上...(我真是个混蛋!)。
服务器确实连续发送了两个字符串,但我愚蠢的客户端实现不能显示来自服务器的消息,除非它跟在客户端发送的消息后面......
所以我再次需要你们的帮助。这是我设计的客户端表单的视图:
由于经验不足,我在按下“连接到服务器”按钮时连接到服务器,只有在按下“发送消息”按钮时,才会显示来自服务器的消息。问题是当没有向服务器发送消息时接收到2(或更多)个来自服务器的消息时,客户端不知道有新消息接收到!我应该在哪里接收来自服务器的消息?(“where”意味着在哪个函数下,例如- 现在它发生在sendMessage_click函数中)。
非常感谢大家迄今为止的所有帮助!!
Read()
中接收到它们. 即使客户端在两次接收到它们时,可能会收到第一个字符串的一半,接着是第一个字符串和第二个字符串连接在一起的后半部分. 接收方需要知道要读取多少消息(定长或长度前缀)并不断调用Read()
,直到完全接收消息。 - Damien_The_UnbelieverWriteLine
之后立即进行flush,会发生什么? - Phil Frostwriter.WriteLine("Do you want to add an email address? (y/n)");
这行代码是否真正执行了。虽然我不知道为什么它不会被执行,但你永远无法确定。你确定客户端没有问题吗?你能否通过Wireshark、Tcpdump等工具来验证网络情况? - Phil Frost