如果使用一个do/while循环,并将listener.AcceptTcpClient()方法放在循环之外,将TcpClient.GetStream().Read()方法放在循环以内,那么服务端可以处理一个客户端的多条请求。
1、服务器
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.IO;
{
class Program
{
static void Main(string[] args)
{
const int BufferSize = 8192;
//ConsoleKey key;
Console.WriteLine("service is running.....");
IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
TcpListener listener = new TcpListener(ip, 8500);
Console.WriteLine("start listening.......");
// 获取一个连接,中断方法
TcpClient remoteClient = listener.AcceptTcpClient(); // 打印连接到的客户端信息
Console.WriteLine("Client Connected!{0} <--{1}",
remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);
// 获得流,并写入buffer中
NetworkStream streamToClient = remoteClient.GetStream();
do
{
byte[] buffer = new byte[BufferSize];
int bytesRead = streamToClient.Read(buffer, 0, BufferSize);
Console.WriteLine("Reading data, {0} bytes ...", bytesRead);
// 获得请求的字符串
string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
Console.WriteLine("Received: {0}", msg);
} while (true);
}
}
}
2、客户端
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Client Running ...");
TcpClient client;
try
{
client = new TcpClient();
client.Connect("localhost", 8500); // 与服务器连接
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); return;
}
// 打印连接到的服务端信息
Console.WriteLine("Server Connected!{0} --> {1}",
client.Client.LocalEndPoint, client.Client.RemoteEndPoint);
NetworkStream streamToServer = client.GetStream();
ConsoleKey key;
Console.WriteLine("Menu: S -Send, X -Exit");
do
{
key = Console.ReadKey(true).Key;
if (key == ConsoleKey.S)
{ // 获取输入的字符串
Console.Write("Input the message: ");
string msg = Console.ReadLine();
byte[] buffer = Encoding.Unicode.GetBytes(msg); // 获得缓存
Console.WriteLine("Sent: {0}", msg);
}
} while (key != ConsoleKey.X);
}
}
}