C#的Socket使用教程
一、Socket是什么?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,,是用于在两个基于TCP/IP协议的应用程序之间相互通信。其实呢,Socket就是把复杂的TCP/IP协议族隐藏在Socket接口后面。
二、使用步骤
1.服务端
static Socket Server = null;//服务端的socket
Dictionary<string,Socket> SocketList = new Dictionary<string, Socket>();//保存客户的对象(这样就可以想发给谁就发给谁)
try
{
string host = "127.0.0.1";//本机
int port = "8866";//端口号
IPAddress iPAddress = IPAddress.Parse(host);
IPEndPoint iP = new IPEndPoint(iPAddress, port);
Server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Server.Bind(iP);//绑定IP地址:端口
Server.Listen(10);//设定最多10个连接请求排队
//建立线程监听client连接请求
Thread t1 = new Thread(new ThreadStart(AcceptConncetion));
t1.Start();
Console.WriteLine("启动成功!"+ "监听:" + Server.LocalEndPoint.ToString());
}
catch (Exception ex)
{
Console.WriteLine("启动失败");
}
/// <summary>
/// 监听客户端连接
/// </summary>
public void AcceptConncetion()
{
Socket acceptSocket = null;
while (true)
{
acceptSocket = Server.Accept();//获取到客户端的
SocketList.Add(acceptSocket.RemoteEndPoint.ToString(), acceptSocket);//添加客户端对象
Console.WriteLine("连接数量"+SocketList.Count);
//每接收到一个连接,启动新线程接收数据
Thread t2 = new Thread(new ParameterizedThreadStart(GetData));
t2.Start(acceptSocket);
}
}
/// <summary>
/// 获取客户端发送来的数据
/// </summary>
/// <param name="clientSocket"></param>
public void GetData(object clientSocket)
{
Socket socket = clientSocket as Socket;
while (true)
{
byte[] bs = new byte[1024 * 1024];
//接收数据
socket.Receive(bs);
string str = Encoding.UTF8.GetString(bs);
this.Invoke(new Action(() =>
{
richTextBox1.AppendText("\n"+str);
}));
}
}
/// <summary>
///给客户端发送信息
/// </summary>
private void Send()
{
var sk = SocketList[0];//选择客户端的socket
string sendData = "一起睡觉嘛";
byte[] bs = Encoding.UTF8.GetBytes(sendData);
sk.Send(bs);
}
2.客户端
1.连接服务端代码并接收信息:
Socket Client = null;//客户端对象socket
string host = "127.0.0.1";
int port = 8866;
IPAddress address = IPAddress.Parse(host);
IPEndPoint iP = new IPEndPoint(address, port);
Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Client.Connect(iP);//连接服务端
Thread t1 = new Thread(new ThreadStart(() =>
{
while (true)
{
byte[] bs = new byte[1024 * 1024];
Client.Receive(bs);//接收信息
string str = Encoding.UTF8.GetString(bs);
this.richTextBox1.Invoke(new Action(() =>
{
richTextBox1.AppendText("\n"+str);
}));
}
}));
t1.Start();
2.发送到客服端:
string sendData = "想一起睡呀";
byte[] bs = Encoding.UTF8.GetBytes(sendData);
Client.Send(bs);//发送信息
总结
一个服务端,n个客户端连接。
学习与快乐并进,只愿当下的我还是还是个阳光开朗的有那么点帅气的小伙子哈哈哈