我正在尝试编写一个从服务器和一些客户端构建的小程序。 服务器将文本消息传输/推送到客户端(客户端不允许发送回服务器,所有客户端应从服务器获取相同的文本消息) 我已经在这里和网上看到了关于这个主题的一些问题,但没有得到我正在寻找的确切解决方案。 大多数解决方案是为每个客户创建一个线程。但我们假设我并不总是知道有多少客户会在一定时间内收听。可能是2,可能是30。 我知道有一种方法可以创建一个线程池,让.NET处理分配线程,但从来没有一个好的练习,也不是我对线程的了解是有益的。 现在我有一个简单的Sever to Client程序,按预期工作,但同样只有一个客户端。 所以这是我的代码:
服务器:
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows;
namespace NetMessageServerWpf
{
public partial class MainWindow : Window
{
TcpClient client;
public MainWindow()
{
InitializeComponent();
this.tcpListener = new TcpListener(IPAddress.Any, 3000);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
}
private void btnSend_Click(object sender, RoutedEventArgs e)
{
if(client == null || !client.Connected)
client = this.tcpListener.AcceptTcpClient();
msg = txtMessage.Text;
SendTCP(client);
}
public TcpListener tcpListener;
public Thread listenThread;
private string msg;
private void ListenForClients()
{
this.tcpListener.Start();
}
public void SendTCP(TcpClient tcpClient)
{
NetworkStream clientStream = tcpClient.GetStream();
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] buffer = encoder.GetBytes(this.msg);
clientStream.Write(buffer, 0, buffer.Length);
clientStream.Flush();
}
}
}
客户端:
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace NetClientSideWpf
{
class Client : Base
{
private string messageString;
public string MessageString
{
get { return messageString; }
set
{
messageString = value;
OnPropertyChanged("MessageString");
}
}
public Client()
{
ConnectToServer();
}
public void ConnectToServer()
{
TcpClient client = new TcpClient();
IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3000);
client.Connect(serverEndPoint);
NetworkStream clientStream = client.GetStream();
Thread ServerThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
ServerThread.Start(client);
}
private void HandleClientComm(object client)
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();
byte[] message = new byte[4096];
int bytesRead;
while (true)
{
bytesRead = 0;
try
{
bytesRead = clientStream.Read(message, 0, 4096);
}
catch
{
break;
}
if (bytesRead == 0)
{
break;
}
ASCIIEncoding encoder = new ASCIIEncoding();
MessageString = encoder.GetString(message, 0, bytesRead);
}
}
}
}
任何帮助都可以! :)
答案 0 :(得分:1)
我认为首先应该在应用程序开始时启动监听器。 然后查看进入连接的间隔(Timer)(TCPListener.Pending http://msdn.microsoft.com/de-de/library/system.net.sockets.tcplistener.pending(v=vs.110).aspx) 如果您获得Connection,则应将TCPClient保存在List中。 按钮单击将消息发送给您的客户端。
我认为这不是最佳解决方案,但它没有多线程; - )
我写了一些示例代码,希望这能帮到你(未经测试):
public partial class MainWindow : Window
{
private TcpListener _server;
private List<TcpClient> _connectedClients;
public MainWindow()
{
InitializeComponent();
_server = new TcpListener(IPAddress.Any, 3000);
_connectedClients = new List<TcpClient>();
_server.Start();
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1); //every 1 sec!
timer.Tick += timer_Tick;
timer.Start();
}
private void SendMessage(string message)
{
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] buffer = encoder.GetBytes(message);
foreach (var client in _connectedClients)
{
NetworkStream clientStream = client.GetStream();
clientStream.Write(buffer, 0, buffer.Length);
clientStream.Flush();
}
}
void timer_Tick(object sender, EventArgs e)
{
Debug.WriteLine("Tick");
Title = "hello";
if (_server.Pending())
{
_connectedClients.Add(_server.AcceptTcpClient());
}
}
}