实例介绍
【实例简介】
基于Socket的服务端C#代码
【实例截图】
【核心代码】
namespace MessageServer
{
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
public class Server
{
public string ipString = "127.0.0.1"; // 服务器端ip
public int port = 4999; // 服务器端口
public Socket socket;
public Print print; // 运行时的信息输出方法
public Dictionary<string, Socket> clients = new Dictionary<string, Socket>(); // 存储连接到服务器的客户端信息
public bool started = false; // 标识当前是否启动了服务
public Server(Print print = null, string ipString = null, int port = -1)
{
this.print = print;
if (ipString != null) this.ipString = ipString;
if (port >= 0)this.port = port;
}
public Server(Print print = null, string ipString = null, string port = "-1")
{
this.print = print;
if (ipString != null) this.ipString = ipString;
int port_int = Int32.Parse(port);
if (port_int >= 0) this.port = port_int;
}
/// <summary>
/// Print用于输出Server的输出信息
/// </summary>
public delegate void Print(string info);
/// <summary>
/// 启动服务
/// </summary>
public void start()
{
try
{
IPAddress address = IPAddress.Parse(ipString);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(address, port));
socket.Listen(10000);
if (print != null)
{
try { print("启动服务【" socket.LocalEndPoint.ToString() "】成功"); }
catch { print = null; }
}
started = true;
new Thread(listenClientConnect).Start(socket); // 在新的线程中监听客户端连接
}
catch (Exception exception)
{
if (print != null)
{
print("启动服务失败 " exception.ToString());
}
started = false;
}
}
/// <summary>
/// 监听客户端的连接
/// </summary>
private void listenClientConnect(object obj)
{
Socket socket = (Socket) obj;
while (true)
{
Socket clientScoket = socket.Accept();
if (print != null)
{
print("客户端" clientScoket.RemoteEndPoint.ToString() "已连接");
}
new Thread(receiveData).Start(clientScoket); // 在新的线程中接收客户端信息
Thread.Sleep(1000); // 延时1秒后,接收连接请求
if (!started) return;
}
}
/// <summary>
/// 发送信息
/// </summary>
public void Send(string info, string id)
{
if (clients.ContainsKey(id))
{
Socket socket = clients[id];
try
{
Send(socket, info);
}
catch(Exception ex)
{
clients.Remove(id);
if (print != null) print("客户端已断开,【" id "】");
}
}
}
/// <summary>
/// 通过socket发送数据data
/// </summary>
private void Send(Socket socket, string data)
{
if (socket != null && data != null && !data.Equals(""))
{
byte[] bytes = Encoding.UTF8.GetBytes(data); // 将data转化为byte数组
socket.Send(bytes); //
}
}
private string clientIp = "";
/// <summary>
/// 输出Server的输出信息到客户端
/// </summary>
public void PrintOnClient(string info)
{
Send(info, clientIp);
}
/// <summary>
/// 接收通过socket发送过来的数据
/// </summary>
private void receiveData(object obj)
{
Socket socket = (Socket) obj;
string clientIp = socket.RemoteEndPoint.ToString(); // 获取客户端标识 ip和端口
if (!clients.ContainsKey(clientIp)) clients.Add(clientIp, socket); // 将连接的客户端socket添加到clients中保存
else clients[clientIp] = socket;
while (true)
{
try
{
string str = Receive(socket);
if (!str.Equals(""))
{
if (str.Equals("[.Echo]"))
{
this.clientIp = clientIp;
print = new Print(PrintOnClient); // 在客户端显示服务器输出信息
}
if (print != null) print("【" clientIp "】" str);
if (str.Equals("[.Shutdown]")) Environment.Exit(0); // 服务器退出
else if (str.StartsWith("[.RunCmd]")) runCMD(str); // 执行cmd命令
}
}
catch (Exception exception)
{
if (print != null) print("连接已自动断开,【" clientIp "】" exception.Message);
socket.Shutdown(SocketShutdown.Both);
socket.Close();
if (clients.ContainsKey(clientIp)) clients.Remove(clientIp);
return;
}
if (!started) return;
Thread.Sleep(200); // 延时0.2秒后再接收客户端发送的消息
}
}
/// <summary>
/// 执行cmd命令
/// </summary>
private void runCMD(string cmd)
{
new Thread(runCMD_0).Start(cmd);
}
/// <summary>
/// 执行cmd命令
/// </summary>
private void runCMD_0(object obj)
{
string cmd = (string)obj;
string START = "[.RunCmd]";
if (cmd.StartsWith(START))
{
cmd = cmd.Substring(START.Length); // 获取cmd信息
Cmd.Run(cmd, print); // 执行cmd,输出执行结果到print
}
}
/// <summary>
/// 从socket接收数据
/// </summary>
private string Receive(Socket socket)
{
string data = "";
byte[] bytes = null;
int len = socket.Available;
if (len > 0)
{
bytes = new byte[len];
int receiveNumber = socket.Receive(bytes);
data = Encoding.UTF8.GetString(bytes, 0, receiveNumber);
}
return data;
}
/// <summary>
/// 停止服务
/// </summary>
public void stop()
{
started = false;
}
}
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论