代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SocketClient
{
class Program
{
//创建1个客户端套接字和1个负责监听服务端请求的线程
private static Thread ThreadClient = null;
private static Socket SocketClient = null;
private static string keyUse = "12345678";
private static string keyDe = "12345678";
static void Main(string[] args)
{
try
{
int port = 8000;
string host = "localhost";//服务器端ip地址
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
//定义一个套接字监听
SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//客户端套接字连接到网络节点上,用的是Connect
SocketClient.Connect(ipe);
}
catch (Exception ex)
{
Console.WriteLine("连接失败!\r\n");
Console.ReadLine();
return;
}
Random rd = new Random();//用于生成随机数
string DateStr = DateTime.Now.ToString("yyyyMMdd");//日期
string str = DateStr + rd.Next(10000).ToString().PadLeft(4, '0');//带日期的随机数
string strEp = DESTool.EncryptDES("******2019"+str+ "连接服务端", keyUse);
ClientSendMsg(strEp);
Thread.Sleep(1000);
ThreadClient = new Thread(Recv);
ThreadClient.IsBackground = true;
ThreadClient.Start();
Console.Read();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
//接收服务端发来信息的方法
public static void Recv()
{
int x = 0;
//持续监听服务端发来的消息
while (true)
{
try
{
//定义一个1M的内存缓冲区,用于临时性存储接收到的消息
byte[] arrRecvmsg = new byte[1024 * 1024];
//将客户端套接字接收到的数据存入内存缓冲区,并获取长度
int length = SocketClient.Receive(arrRecvmsg);
//将套接字获取到的字符数组转换为人可以看懂的字符串
string strRevMsg = Encoding.UTF8.GetString(arrRecvmsg, 0, length);
string[] splitStr = strRevMsg.Split(':');
string strDe = DESTool.DecryptDES(splitStr[splitStr.Length-1], keyDe);
if(strDe.Contains("连接服务端") ||strDe.Substring(0, 28) != "******2019" + DateTime.Now.ToString("yyyyMMdd"))
{
continue;
}
if (x == 1)
{
Console.WriteLine("\r\n服务器:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + "\r\n" + strDe.Substring(32, strDe.Length - 32) + "\r\n");
}
else
{
Console.WriteLine(strDe.Substring(32, strDe.Length - 32) + "\r\n");
x = 1;
}
}
catch (Exception ex)
{
Console.WriteLine("远程服务器已经中断连接!" + ex.Message + "\r\n");
break;
}
Thread.Sleep(1000);
}
}
//发送字符信息到服务端的方法
public static void ClientSendMsg(string sendMsg)
{
//将输入的内容字符串转换为机器可以识别的字节数组
byte[] arrClientSendMsg = Encoding.UTF8.GetBytes(sendMsg);
//调用客户端套接字发送字节数组
SocketClient.Send(arrClientSendMsg);
}
}
}
加密工具类:DESTool
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace SocketClient
{
/// <summary>
/// DES对称加密和解密的工具类
/// </summary>
public class DESTool
{
/// <summary>
/// DES加密字符串
/// </summary>
/// <param name="encryptString">待加密的字符串</param>
/// <param name="encryptKey">加密密钥,要求为8位</param>
/// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
public static string EncryptDES(string encryptString, string key)
{
try
{
byte[] rgbKey = Encoding.UTF8.GetBytes(key);
//用于对称算法的初始化向量(默认值)。
byte[] rgbIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// DES解密字符串
/// </summary>
/// <param name="decryptString">待解密的字符串</param>
/// <param name="key">解密密钥,要求8位</param>
/// <returns></returns>
public static string DecryptDES(string decryptString, string key)
{
try
{
//用于对称算法的初始化向量(默认值)
byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
byte[] rgbKey = Encoding.UTF8.GetBytes(key);
byte[] rgbIV = Keys;
byte[] inputByteArray = Convert.FromBase64String(decryptString);
DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
catch
{
return decryptString;
}
}
}
}
源代码地址:https://download.csdn.net/download/it_ziliang/11435537