c#简单的socket通讯demo

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
namespace ClientSocket
{
class Program
{
private static Socket ServersClientSocket;//服务端得到的客户端的SOCKET
private static Socket ClientSocket;//客户端Socket
private static object lockHelper = new object();
/// <summary>
/// 开启服务端
/// </summary>
private static void StartAccept()
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.3.18"), 1005);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//下一句 设置SOCKET允许多个SOCKET访问同一个本地IP地址和端口号
//server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
server.Bind(ipep);
server.Listen(60);//非阻塞方法
while (true)
{
try
{
Console.WriteLine("server:being listen");
ServersClientSocket = server.Accept();//阻塞方法
Console.WriteLine("server:accept one link");
Thread t = new Thread(new ThreadStart(StartReceive));
t.Start();
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
/// <summary>
/// 服务端开始接收数据
/// </summary>
private static void StartReceive()
{
IPEndPoint clientep = (IPEndPoint)ServersClientSocket.RemoteEndPoint;
while (true)
{
var message = RecevieMessage();
Console.WriteLine("server:the client send message is:\n" + message);
}
}
/// <summary>
/// 客户端开始连接服务端
/// </summary>
private static void StartConnect()
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.3.18"), 1005);
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ClientSocket.Connect(ipep);
while (true)
{
Console.WriteLine("client:please put your message in:");
string msg = Console.ReadLine();
byte[] data = Encoding.Unicode.GetBytes(msg);
SendMessage(data);
}
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="msg"></param>
private static void SendMessage(byte[] data)
{
int total = 0;
int size = data.Length;
int dataleft = size;
int sent;
byte[] datasize = new byte[4];
datasize = BitConverter.GetBytes(size);
ClientSocket.Send(datasize);
Console.WriteLine("发送的数据长度:" + size.ToString());
while (total < size)
{
sent = ClientSocket.Send(data, total, dataleft, SocketFlags.None);
total += sent;
dataleft -= sent;
}
}
/// <summary>
/// 接收消息
/// </summary>
private static string RecevieMessage()
{
int total = 0;
int recv;
byte[] datasize = new byte[4];
recv = ServersClientSocket.Receive(datasize, 0, 4, SocketFlags.None);
int size = BitConverter.ToInt32(datasize, 0);
int dataleft = size;
byte[] data = new byte[size];
while (total < size)
{
recv = ServersClientSocket.Receive(data, total, dataleft, SocketFlags.None);
if (recv == 0)
{
data = null;
break;
}
total += recv;
dataleft -= recv;
}
if (data == null)
{
return "error";
}
string result = Encoding.Unicode.GetString(data.Take(36).ToArray());
return result;
}
/// <summary>
/// 入口函数
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(StartAccept));
t.Start();
Thread.Sleep(3000);//等待服务线程开始工作
Thread t2 = new Thread(StartConnect);
t2.Start();
while (true)
{
ConsoleKeyInfo a = Console.ReadKey();
if (a.KeyChar == '+')
{
System.Environment.Exit(0);
}
}
}
}
}
代码中注释比较多
如果仍旧看不懂请看JimmyZhang的这篇文章
http://www.cnblogs.com/JimmyZhang/archive/2008/09/07/1286300.html
讲的很细很基础
标签:
socket
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
2008-12-24 T-SQL学习笔记(索引贴)
2008-12-24 简单的语法知识