110,477
社区成员
发帖
与我相关
我的任务
分享
private void Startsocket()
{
try
{
IPAddress ip = IPAddress.Any;
//当开始监听时候,在服务器创建一个负责IP地址跟端口号的Socket
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint(ip, 9090);
//监听
socketWatch.Bind(point);
//连接数量为10个
socketWatch.Listen(10);
}
catch { throw; }
}
public void ListenClickConnect(object o)
{
Socket socketWatch = o as Socket;
//等待用户连接创建一个负责通信的Socket
while (true)
{
//最大连接数
int number = 10;
if (disSocket.Count > number)
{
socketWatch.Close();
socketWatch.Dispose();
ShowMsg("连接数量已达到上限");
}
try
{
//关闭服务器时 跳出循环
if (stop)
{
break;
}
//等到客户端新的连接
socketSend = socketWatch.Accept();
//将远程客户端IP地址存储到泛型集合中
disSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start(socketSend);
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");
//timer.Start();
AddKJ();
}
catch { break; }
}
bool stop = false;
private void Stop_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i <= namenumber; i++)
{
Image images = gridcontrol.FindName("image" + i) as Image;
Label label = gridcontrol.FindName("label" + i) as Label;
if (images != null)
{
gridcontrol.Children.Remove(images);
gridcontrol.UnregisterName("image" + i);
gridcontrol.Children.Remove(label);
gridcontrol.UnregisterName("label" + i);
}
Image image = gridcontrol.FindName("image") as Image;
image.Visibility = Visibility.Visible;
}
ShowMsg("关闭服务");
if (startandstop == false)
{
startandstop = true;
startbut.IsEnabled = true;
stopbut.IsEnabled = false;
startbut.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF5B93E4"));
stopbut.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFF7CDCD"));
}
//断开通讯和关闭监听
if (socketSend != null && socketSend.Connected)
{
socketSend.Shutdown(SocketShutdown.Both);
socketSend.Close();
socketSend.Dispose();
stop = true;
socketWatch.Close();
socketWatch.Dispose();
disSocket.Clear();
}
else
{
stop = true;
socketWatch.Close();
socketWatch.Dispose();
}
}
int erro = 0;
private void Receive(object o)
{
socketSend = o as Socket;
while (true)
{
try
{
//客户端连接成功后服务器接收发来消息
byte[] buffer = new byte[1024 * 1024 * 2];
//实际接收有效字节数
int r = socketSend.Receive(buffer);
if (r == 0)
{
erro += 1;
Erroe(erro);
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(str);
SendData(str);
}
catch
{
break;
}
}
}
private void Receive(object o)
{
socketSend = o as Socket;//socketSend这个变量在哪定义的,是不是被覆盖了
while (true)
{
try
{
//客户端连接成功后服务器接收发来消息
byte[] buffer = new byte[1024 * 1024 * 2];
//实际接收有效字节数
int r = socketSend.Receive(buffer);
if (r == 0)
{
erro += 1;
Erroe(erro);
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(str);
SendData(str);
}
catch
{
break;
}
}
}
另外,看你描述,客户端连上后要反复发消息,还需要考虑很多事情,粘包、心跳等等