其实这些东西网上都有,但是比较凌乱,很少有封装好的类,在此共享一下。。。
一个Socket服务器类,一个Socket客户端类,都可以直接拿去用,下边有详细的调用示例。
需要说明的是,服务器类没有处理多客户连接,只是简单的响应单客户连接。
另外,提醒一点,尤其是很多新手容易犯的错误,就是服务器类处理事务是在线程中进行的,此时不能访问界面上的控件,需要委托跨线程访问。
Socket服务器类(SocketServicesHelper.cs):
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.Text.RegularExpressions;
namespace USBControl
{
/// <summary>
/// Socket服务器类
/// </summary>
public class SocketServicesHelper
{
private Socket socket1 = null;
private Socket socket2 = null;
private Thread ListenThread = null;
private int port = 0; //监听端口
/// <summary>
/// 构造方法
/// </summary>
/// <param name="port">监听端口</param>
public SocketServicesHelper(int port)
{
this.port = port;
}
/// <summary>
/// 启动服务
/// </summary>
public void startServices()
{
try
{
//获取本机IP
IPAddress ip = IPAddress.Parse(getIP());
//步骤1 创建网络端点IPEndPoint
IPEndPoint myServer = new IPEndPoint(ip, port);
//步骤2 创建套接字Socket
socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//步骤3 套接字绑定到网络端点
socket1.Bind(myServer);
//创建监听线程
ListenThread = new Thread(new ThreadStart(ListenFunction));
//启动线程
ListenThread.Start();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 监听方法,在线程中启动
/// </summary>
void ListenFunction()
{
try
{
clsUSBControl usbcl = new clsUSBControl();
RegChangeNotice regChangeNotice = new RegChangeNotice();
//步骤4 设置最大客户端连接数
socket1.Listen(5);
//循环检测客户端连接
while (true)
{
//步骤5 检测客户端连接
socket2 = socket1.Accept();
//步骤6 判断连接状态
if (socket2.Connected)
{
//步骤7 接收客户端消息
byte[] clientData = new byte[1024];
int i = socket2.Receive(clientData);
string removeMsg = Encoding.Unicode.GetString(clientData, 0, i).Split(new char[] { '|' })[0].Split(new char[] { ' ' })[1];
//根据消息做出相应动作
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
//关闭连接
if (socket1.Connected)
{
socket1.Shutdown(SocketShutdown.Both);
socket1.Close();
}
if (socket2.Connected)
{
socket2.Shutdown(SocketShutdown.Both);
socket2.Close();
}
}
}
/// <summary>
/// 获得本机IP地址
/// </summary>
/// <returns></returns>
private string getIP()
{
string ipAddress = "";
Process p = null;
StreamReader reader = null;
try
{
ProcessStartInfo start = new ProcessStartInfo("cmd.exe");
start.FileName = "ipconfig";
start.Arguments = "/all";
start.CreateNoWindow = true;
start.RedirectStandardOutput = true;
start.RedirectStandardInput = true;
start.UseShellExecute = false;
p = Process.Start(start);
reader = p.StandardOutput;
string line = reader.ReadLine();
while (!reader.EndOfStream)
{
if (line.ToLower().IndexOf("ip address") > 0 || line.ToLower().IndexOf("ipv4 地址") > 0 || line.ToLower().IndexOf("ip地址") > 0)
{
int index = line.IndexOf(":");
index += 2;
ipAddress = ipAddress + line.Substring(index) + ",";
}
line = reader.ReadLine();
}
}
catch(Exception ex)
{
throw ex;
}
finally
{
if (p != null)
{
p.WaitForExit();
p.Close();
}
if (reader != null)
{
reader.Close();
}
}
return Regex.Match(ipAddress.Equals("") ? ipAddress : ipAddress.Substring(0, ipAddress.Length - 1), "[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}").ToString();
}
}
}
调用示例:
//实例化时传入监听端口,本机IP自动获取
SocketServicesHelper ssh = new SocketServicesHelper(8881);
//开始监听
ssh. startServices();
Socket 客户端类(SocketClientHelper.cs):
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace BLL
{
/// <summary>
/// Socket客户端类
/// </summary>
public class SocketClientHelper
{
private IPAddress ip = null;
private int port = 0;
private Socket socket = null;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="ip">服务器IP</param>
/// <param name="port">服务器端口</param>
public SocketClientHelper(IPAddress ip, int port)
{
this.ip = ip;
this.port = port;
}
/// <summary>
/// 向服务器发送消息
/// </summary>
/// <param name="sendStr">消息内容</param>
/// <returns></returns>
public string send(string sendStr)
{
try
{
LayerParameter lp = new LayerParameter();
IPEndPoint removeServer = new IPEndPoint(ip, port);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(removeServer);
//检查连接状态
if (socket.Connected)
{
//转换编码
byte[] bs = Encoding.Unicode.GetBytes(sendStr);
//发送消息
socket.Send(bs, bs.Length, 0);
//断开SOCKET
socket.Shutdown(SocketShutdown.Both);
//关闭SOCKET
socket.Close();
return "设置成功!";
}
else
{
return "与客户端通信失败,可能是电脑未开启或者客户端未开启!";
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}
调用示例:
//实例化时传入服务器IP和消息端口
SocketClientHelper sch = new SocketClientHelper(IPAddress.Parse("192.168.24.177"),8881);
//发送消息
sch.send("Hello Word!");