一、socket是什么 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来
一、socket是什么
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
二、套接字的工作流程

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
三、服务端
private void btnListen_Click(object sender, EventArgs e)
{
IPEndPoint point = new IPEndPoint(IPAddress.Any, 13000);//IPAddress.Any本机任何网卡IP。本机端口查看netstat -an
//服务端Socket定义
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(point); //绑定IP
socket.Listen(10);//启动监听。最大监听数,同一个时间点过来10个客户端,排队
ShowMsg("服务器开始监听");
Thread thread = new Thread(AcceptInfo);
thread.Start(socket);
}
//记录通信用的Socket
Dictionary<string, Socket> dic = new Dictionary<string, Socket>();
// private Socket client;
void AcceptInfo(object o)
{
Socket socket = o as Socket;
while (true)
{
//通信用socket
try
{
Socket clientSocket = socket.Accept();//如果客户端有请求,生成一个新的Socket
string point = clientSocket.RemoteEndPoint.ToString();
ShowMsg(point + "连接客户端成功!");
dic.Add(point, clientSocket);
//接收消息
Thread th = new Thread(ReceiveMsg);
th.Start(clientSocket);
}
catch (Exception ex)
{
break;
}
}
socket.Close();
}
//接收消息
void ReceiveMsg(object socket)
{
Socket clientSocket = socket as Socket;
while (true)
{
//接收客户端发送过来的数据
try
{
//定义byte数组存放从客户端接收过来的数据
byte[] buffer = new byte[1024 * 1024];
int n = clientSocket.Receive(buffer);//将接收过来的数据放到buffer中,并返回实际接受数据的长度
//将字节转换成字符串
string words = Encoding.Unicode.GetString(buffer, 0, n);
Console.WriteLine(clientSocket.RemoteEndPoint.ToString() + ":" + words);
byte[] msg = Encoding.Unicode.GetBytes(words);
clientSocket.Send(msg);//发送数据,字节数组
}
catch (Exception ex)
{
break;
}
}
clientSocket.Shutdown(SocketShutdown.Both);//禁止发送和接受数据
clientSocket.Close();//关闭socket,释放资源
}
四、客户端
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint("127.0.0.1", 13000));//连接到的服务端IP
clientSocket.Connect(point);//连接到服务器
ShowMsg("连接成功");
ShowMsg("服务器" + client.RemoteEndPoint.ToString());
ShowMsg("客户端:" + client.LocalEndPoint.ToString());
Thread th = new Thread(ReceiveMsg);//连接成功后,就可以接收服务器发送的信息了
th.IsBackground = true;
th.Start();
clientSocket.Shutdown(SocketShutdown.Both);//禁止发送和接受数据
clientSocket.Close();//关闭socket,释放资源
五、Socket对象的成员
1、属性
2、方法
Accept
Connect
Disconnect
Receive
ReceiveFrom
ReceiveMessageFrom
Send
SendFile
SendTo
其它
到此这篇关于C#之Socket(套接字)通信的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。
