一个项目需要在winform下开发socket通讯
根据网上的代码修改 如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading;
namespace LaserMiddleware.TCP
{
public class TCPServer
{
private object o = new object();
//存储已连接的客户端的泛型集合
private static Dictionary<string, Socket> socketList = new Dictionary<string, Socket>();
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public static TCPServer Instance;
public static TCPServer GetInstance()
{
if (Instance == null)
{
Instance = new TCPServer();
}
return Instance;
}
/// <summary>
/// 创建Scoket 服务端
/// </summary>
/// <param name="IP"></param>
/// <param name="prot"></param>
/// <returns></returns>
public Socket CreateSocket(string IP, string prot)
{
//定义一个套接字用于监听客户端发来的信息 包含3个参数(IP4寻址协议,流式连接,TCP协议)
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//发送信息 需要1个IP地址和端口号
IPAddress ipaddress = IPAddress.Parse(IP); //获取文本框输入的IP地址
//将IP地址和端口号绑定到网络节点endpoint上
IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(prot)); //获取文本框上输入的端口号
//套接字点听绑定网络端点
socketWatch.Bind(endpoint);
//将套接字的监听队列长度设置为20
socketWatch.Listen(20);
return socketWatch;
}
/// <summary>
/// 创建一个负责监听客户端的线程 并启动
/// </summary>
/// <returns></returns>
public void CreateThread(Socket socket)
{
//创建一个负责监听客户端的线程
Thread threadWatch = new Thread(new ParameterizedThreadStart(WatchConnecting));
//将窗体线程设置为与后台同步
threadWatch.IsBackground = true;
//启动线程
threadWatch.Start(socket);
}
/// <summary>
/// 持续不断监听客户端发来的请求, 用于不断获取客户端发送过来的连续数据信息
/// </summary>
private void WatchConnecting(object socket)
{
Socket socketWatch = socket as Socket;
while (true)
{
Socket socConnection = null;
try
{
socConnection = socketWatch.Accept();
//((IPEndPoint)socConnection.RemoteEndPoint).Address.ToString();//获取客户端IP
//((IPEndPoint)socConnection.RemoteEndPoint).Port.ToString();//获取客户端端口
}
catch (Exception ex)
{
break;//提示套接字监听异常 ex.Message
}
//创建通信线程
ParameterizedThreadStart pts = new ParameterizedThreadStart(ServerRecMsg);
Thread thr = new Thread(pts);
thr.IsBackground = true;
//启动线程
thr.Start(socConnection);
string strIP = ((IPEndPoint)socConnection.RemoteEndPoint).Address.ToString();
string strPort = ((IPEndPoint)socConnection.RemoteEndPoint).Port.ToString();
socketList.Add(strIP + ":" + strPort, socConnection);
}
}
/// <summary>
/// 接收客户端发来的信息
/// </summary>
private void ServerRecMsg(object socketClientPara)
{
Socket socketServer = socketClientPara as Socket;
int ReceiveBufferSize = 8 * 1024;
while (true)
{
int firstReceived = 0;
byte[] buffer = new byte[ReceiveBufferSize];
try
{
List<byte> ls = new List<byte>();
//获取接收的数据,并存入内存缓冲区 返回一个字节数组的长度
if (socketServer != null) firstReceived = socketServer.Receive(buffer);
if (firstReceived > 0) //接受到的长度大于0 说明有信息或文件传来
{
ls.AddRange(buffer.Skip(0).Take(firstReceived));
//对接收数据进行逻辑判断 回复客户端需要的数据
string port = ((IPEndPoint)socketServer.RemoteEndPoint).Port.ToString();
string msg = port + "recv OK:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n";
byte[] datas = System.Text.Encoding.UTF8.GetBytes(msg);
socketServer.Send(datas);//小数据可以一次性发送 如果大数据要分端发送 用while 循环
}
}
catch (Exception ex)
{
break; //捕获异常信息 ex.Message
}
}
}
public void start()
{
Socket testSocket = CreateSocket("192.168.20.30", "8999");
CreateThread(testSocket);
}
public void Send(string cmd)
{
foreach (var socket in socketList)
{
try
{
byte[] bytes = new byte[2048];
bytes = Encoding.Default.GetBytes(cmd);
socket.Value.Send(bytes);
}
catch { }
}
}
}
}
在窗体代码中加入启动Server
TCPServer.GetInstance().start();
窗体代码中给所有客户端发送数据的方法
TCPServer.GetInstance().Send("Test");
下面是客户端连接测试效果

该代码示例展示了如何在WinForm应用中创建一个TCP服务器,监听客户端连接,接收和发送数据。服务器使用Socket类建立监听,创建线程来处理新连接,并存储已连接的客户端。客户端可以连接到指定IP和端口,并能接收到服务器的响应。
750

被折叠的 条评论
为什么被折叠?



