我正在尝试使用c#进行客户端服务器通信。我使客户端和服务器相互通信。但是,我面临的问题是如何停止沟通?
条件:服务器应该一直在监听(当存在多个客户端时)。(目前,我正在使用单个客户端)。客户端应该有一个停止或退出条件(即,当客户端发送“退出”时,客户端应该终止,服务器应该仍然在监听其他客户端)完成传输数据。
我是c#的新手。尝试搜索谷歌也。但没找到我需要的东西。
我的部分代码:
服务器:
try
{
IPAddress addr = IPAddress.Parse("127.0.0.1");
string a = "recieved by server";
TcpListener Receiver = new TcpListener(addr, 1234);
Receiver.Start();
Console.WriteLine("trying to connect to " + addr);
Socket s = Receiver.AcceptSocket();
Console.WriteLine("Connected");
while (true)
{
byte[] b = new byte[100];
int k = s.Receive(b);
char[] chars = new char[b.Length / sizeof(char)];
System.Buffer.BlockCopy(b, 0, chars, 0, b.Length);
string dataReceived = new string(chars);
Console.WriteLine(dataReceived);
byte[] bw = new byte[a.Length * sizeof(char)];
System.Buffer.BlockCopy(a.ToCharArray(), 0, bw, 0, bw.Length);
Console.WriteLine("sending Acknowledgement to client");
s.Send(bw);
}
//Receiver.Stop();
}
客户端:
try
{
TcpClient TcpC = new TcpClient();
TcpC.Connect("127.0.0.1", 1234);
while (true)
{
Console.WriteLine("enter somethiong to send");
String s = Console.ReadLine();
NetworkStream CStream = TcpC.GetStream();
byte[] bw = new byte[s.Length * sizeof(char)];
System.Buffer.BlockCopy(s.ToCharArray(), 0, bw, 0, bw.Length);
Console.WriteLine("Transmit");
CStream.Write(bw, 0, bw.Length);
if (s == "exit")
{
CStream.Flush();
CStream.Close();
TcpC.Close();
break;
}
byte[] br = new byte[100];
int k = CStream.Read(br, 0, 100);
char[] chars = new char[br.Length / sizeof(char)];
System.Buffer.BlockCopy(br, 0, chars, 0, br.Length);
string ackReceived = new string(chars);
Console.WriteLine(ackReceived);
}
//TcpC.Close();
}
答案 0 :(得分:0)
使用Socket s = Receiver.AcceptSocket();
从客户端接受套接字连接后,您需要将命令处理逻辑放在while (true) { }
块中的另一个线程中(使用Task
或Thread
然后你应该再次使用Receiver.AcceptSocket();
接受新的套接字连接。
答案 1 :(得分:0)
问题是你做了
Receiver.Stop();
什么时候应该是你要关闭的套接字。
我的想法是你创建一个新的套接字来处理每次客户端连接 - 这是你终止的连接,而不是主侦听套接字。
这里有很好的示例代码:
https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=vs.110).aspx