Socket学习
服务器端代码:(ctrl + shift + space 重载 ctrl + k+ s 外侧代码)
//第一个参数寻址方式 第二个参数是数据传输方式 第三个是传输协议
Socket socket = new Socket(AddressFaimly.InterNetwork,SocketType.Stream, ProtocoType.Tcp);
//绑定端口和IP
socket.Bind(new IPEndpoint(ipstring,portNum));
//侦听
socket.Listen(10);
//线程池创建线程:由于socket.Accept会阻塞主线程,所以开启一个新线程
ThreadPool.QueueuerworkItem(p=>{
Socket serversocket = (Socket) p;
while(true)
{
//接受客户端连接,返回客户端通讯socket
Socket proxSocket = socket.Accept();
WriteText("有客户端连接",proxsocket.RemoteEndpoint.Tostring());
Task task = new Task(s=>{
//客户端通讯socket
Socket pSocket = (socket)s;
while(true)
{
try
{
byte[] buffer = new byte[1024*1024];
int realLen = pSocket.Receive(buffer);
//客户端正常退出,返回一个空字节
if(realLen<=0)
{
if(pSocket != null && pSocket.connected)
{
WriteText("客户端退出",psocket.RemoteEndpoint.Tostring());
pSocke.shutdown(socketshutdown.Both);
pSocket.close();
return;
}
}
string strmsg = Encoding.Default.Getstring(buffer,0,realLen);
WriteText(strmsg,proxsocket.RemoteEndpoint.Tostring());
}
catch(Exception e)
{
if(psocket != null && psocket.connected)
{
WriteText("客户端异常",psocket.RemoteEndpoint.Tostring());
psocket.shutdown(socketshutdown.both);
pSocket.close();
return;
}
}
}
},proxSocket);
thread.isbackground = true;
task.Start();
}
},socket );
public void WriteText(string text ,string form)
{
if(txtLog.InvokeRequired)
{
//跨线程调用控件
txtLot.Invoke(new Action(()=>{
this.txtLog.Text = string.Format("当前一个客户连接上{0}\r\n",text,from ,this.txtLog.Text);
}));
}
else
{
this.txtLog.Text = string.Format("当前一个客户连接上{0}\r\n",text,from ,this.txtLog.Text);
}
客户端:
public socket currentSocket{set;get;};
try
{
//第一个参数寻址方式 第二个参数是数据传输方式 第三个是传输协议
Socket socket = new Socket(AddressFaimly.InterNetwork,SocketType.Stream, ProtocoType.Tcp);
//绑定端口和IP
socket.Connect(IPstring,portNum);
currentSocket = socket;
//socket.send(10);
//线程池创建线程:由于socket.Accept会阻塞主线程,所以开启一个新线程
ThreadPool.QueueuerworkItem(p=>{
Socket serversocket = (Socket) p;
//Task.Factory.Startnew();
Thread thread = new Thread(()=>{
while(true)
{
try
{
byte[] buffer = new byte[1024*1024];
int realLen = pSocket.Receive(buffer);
if(realLen<=0)
{
if(pSocket != null && pSocket.connected)
{
WriteText("客户端退出",psocket.RemoteEndpoint.Tostring());
pSocke.shutdown(socketshutdown.Both);
pSocket.close();
return;
}
}
string strmsg = Encoding.Default.Getstring(buffer,0,realLen);
WriteText(strmsg,proxsocket.RemoteEndpoint.Tostring());
}
}
catch
{}
});
thread.isbackground = true;
thread.start();
}
catch(Exception e)
{
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 自定义通信协议——实现零拷贝文件传输
· Brainfly: 用 C# 类型系统构建 Brainfuck 编译器
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· DeepSeek 全面指南,95% 的人都不知道的9个技巧(建议收藏)
· 自定义Ollama安装路径
· 本地部署DeepSeek
· 快速入门 DeepSeek-R1 大模型
· DeepSeekV3+Roo Code,智能编码好助手