我有一个客户端服务器程序。客户端连接到服务器后,客户端的IPAddress将存储到组合框中。如果我想向客户端发送消息(使用按钮),我只需要选择某个IP地址并发送我的消息。那只是为了测试。
我的主要目的是在连接到服务器后,我想(自动)向comboBox内的每个客户端发送相同的消息。如何让服务器向这些客户端发送消息?还检查是否有人连接,然后自动发送相同的消息。
这是自动发送相同信息的地方。
public void sendToClient()
{
try
{
for(int i = 0; i < myComboBox.Items.Count; i++)
{
//string value = comboBox1.GetItemText(comboBox1.Items[i]);
sendData(openedFile.ToString());
}
}
catch (Exception ex)
{
output.Text += "Error.....\n " + ex.StackTrace;
}
}
然后是sendData()函数
private void sendData(String data)
{
IPAddress ipep = IPAddress.Parse(comboBox1.SelectedItem.ToString());
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipept = new IPEndPoint(ipep, hostPort);
NetworkStream nStream = tcpClient.GetStream();
ASCIIEncoding asciidata = new ASCIIEncoding();
byte[] buffer = asciidata.GetBytes(data);
if (nStream.CanWrite)
{
nStream.Write(buffer, 0, buffer.Length);
nStream.Flush();
}
}
答案 0 :(得分:2)
我猜你可能会做以下事情:
1)使用不同的线程调用SendData。您将获得更高的性能和更少的延迟(见下文)。
2)我相信您可能会检测到您将IP添加到组合框中以进行上述调用 - 它总是比在组合框中检查整个IP更有效。例如:
' At some point of MODULE or top of form
dim ListOfIPS as List(of String)
' At new connection event
ListOFIPs.Add(IPNumber)
Dim MyThread As Thread = New Thread(CType(Sub() SendData(IPNumber, MyCustomMessage), ThreadStart))
MyThread.SetApartmentState(Threading.ApartmentState.MTA)
MyThread.Start()
3)并且,如果你真的需要向连接的所有人发送消息,你可以尝试类似的事情:
for each Guy as String in ListOfIPS
Dim MyThread As Thread = New Thread(CType(Sub() SendData(Guy, MyCustomMessage), ThreadStart))
MyThread.IsBackground = False
MyThread.SetApartmentState(Threading.ApartmentState.MTA)
MyThread.Start()
next
4)如果你看到LIST(of T)的帮助,你会发现当它断开连接时如何定位和删除(或者只是将它变为空白字符串)一些IP ...