socket的tcp协议连接服务器,TCP/IP协议详解(二) 基于C# Socket的C/S模型建立

本文介绍了如何使用C#通过Socket实现TCP/IP的客户端/服务器通信。客户端建立TCP连接,发送数据并接收服务器响应,最后关闭连接。服务器端监听连接,接收并回送数据。代码涉及线程处理和异常处理,提供了关键代码段和实际测试界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前一章节我提到了在Windows,LINUIX内核已经有了完整的TCP/IP实现,只要会调用专用接口函数: Socket和TLI(传输层接口)就足够了,正好我最近在了解C#,所以便通过Socket实现简单的客户端/服务器模型,程序本身并不难,不过理解了之后对于认知TCP/IP有着良好的促进作用。

想要实现Socket通讯,具体实现参考标准的流程,如下图:

f51a862cc6440b36bcc21b99d9b39288.png

了解了上图,那么就可以开始C#的编程了(窗体设计等参考源码,我主要讲解核心代码):

客户端:

客户端的实现比较简单

1.建立tcp连接(等同于socket 和 connect),处理连接失败状态

2.对于建立成功的连接,发送数据,并等待服务器返回

3.接收数据,输出到编辑框

4.关闭连接

private void button1_Click(objectsender, EventArgs e)

{try{string s_ipaddress0 =textBox1.Text;string s_ipaddress1 =textBox2.Text;string s_ipaddress2 =textBox3.Text;string s_ipaddress3 =textBox4.Text;string s_port =textBox5.Text;//限定port的合法性

boolisPort;intport;

isPort= Int32.TryParse(s_port, outport);if (!(isPort && port >= 0 && port <= 65536))

{

OutToClient("Port is Invalid!");return;

}//限定ip地址的合法性

string host = s_ipaddress0 + "." + s_ipaddress1 + "." + s_ipaddress2 + "." +s_ipaddress3;if (!IsIpAdress(host))

{

OutToClient("IpAdress is invaild!");return;

}

IPAddress ip=IPAddress.Parse(host);

IPEndPoint ipe= new IPEndPoint(ip, port); //Ip端口绑定 如192.168.1.48:80//发送框不能为空, 不然会导致GetBytes出错

if (textBox6.Text == "")

{

OutToClient("Send Text is empty!");return;

}

OutToClient("Conneting...");int timeout = 1000;//tcpClient连接到指定端口,并处理超时

TcpClient NetworkClient =TimeOutSocket.Connect(ipe, timeout);

NetworkStream ntwStream=NetworkClient.GetStream();if (!ntwStream.CanWrite)

{

OutToClient("Data can not be write!");return;

}//向绑定地址端口发送数据

OutToClient("Client send:" +textBox6.Text);string sendStr =textBox6.Text;byte[] by_send =Encoding.ASCII.GetBytes(sendStr);

ntwStream.Write(by_send,0, by_send.Length);//等待服务器端返回数据

string recvStr = "";byte[] recvBytes = new byte[4096];int bytes = ntwStream.Read(recvBytes, 0, recvBytes.Length);//将接收到数据转发输出到Client编辑框

recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);

OutToClient(recvStr);//关闭连接, 一次发送完成

ntwStream.Close();

NetworkClient.Close();

OutToClient("Conneting Close!\r\n");

}catch(ArgumentNullException ii)

{

OutToClient("ArgumentNullException:"+ii);

}catch(SocketException ii)

{

OutToClient("Socket failed!");

}catch(Exception ii)

{

OutToClient("Conneting faild!" +ii);

}

}

服务器内的代码涉及到的知识多一些(因为初学C#,没有理解委托,所以用线程方式处理)

1.通过按键1开辟监听线程,用于接收

2.监听线程创建Socket套接字,绑定到指定端口并监听

3.监听线程堵塞在等带连接建立

4.连接建立后监听线程读取客户端数据并回送给客户端处理后数据,然后循环堵塞在连接建立

5.通过按键2删除Socket套接字触发异常,结束线程(不知道怎么处理,只能用比较low的方法)

按照上述的流程,程序如下:

//新建线程 开始监听

private void button1_Click(objectsender, EventArgs e)

{try{

isConnectExit= false;

button1.Enabled= false;

button2.Enabled= true;

Thread Listen_thread= newThread(ListenClientConnect);

Listen_thread.IsBackground= true;

Listen_thread.Start();

}catch(Exception ii)

{

OutToServer("Connet faild!" +ii);

}

}

//监听线程 主要处理数据接收发送

private void ListenClientConnect(objectobj)

{string s_ipaddress0 =textBox1.Text;string s_ipaddress1 =textBox2.Text;string s_ipaddress2 =textBox3.Text;string s_ipaddress3 =textBox4.Text;string s_port =textBox5.Text;//限定port的合法性

boolisPort;intport;

isPort= Int32.TryParse(s_port, outport);if (!(isPort && port >= 0 && port <= 65536))

{

OutToServer("Port is Invalid!");return;

}//限定ip地址的合法性

string host = s_ipaddress0 + "." + s_ipaddress1 + "." + s_ipaddress2 + "." +s_ipaddress3;if (!IsIpAdress(host))

{

OutToServer("IpAdress is invaild!");return;

}

IPAddress ip=IPAddress.Parse(host);

IPEndPoint ipe= newIPEndPoint(ip, port);//新建socket通讯 绑定指定IP+Port 并监听

server_socket = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

server_socket.Bind(ipe);

server_socket.Listen(10);

OutToServer("wait for connect...");while (isConnectExit == false)

{

Socket CurrentSocket;try{//等待连接 完成三次握手

CurrentSocket =server_socket.Accept();if(isConnectExit == true)

{

CurrentSocket.Close();//关闭Socket

server_socket.Close();break;

}

OutToServer("Get a Connect!");

ServerProcess(CurrentSocket);

}catch{

OutToServer("Connet exti!");

}

}

}

//断开连接

private void button2_Click(objectsender, EventArgs e)

{

isConnectExit= true;

button2.Enabled= false;

button1.Enabled= true;if (server_socket != null)

{

server_socket.Close();

}

}

如此就完成了简单的C/S服务器功能。

实际测试界面如下:

5217a18103567ce0b77f97c984c10816.png

8c8840f53bcb3bdeae35ad413829a4a7.png

原文:http://www.cnblogs.com/zc110747/p/4905035.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值