Socket使用 - 1
后期项目实战:多人在线聊天室
源码位置:https://git.oschina.net/z13qu/BlogProjects
课前须知
- 这里不讲解Socket和TCP/IP的底层知识
对于初学者来说底层原理枯燥难懂,越讲越懵逼,等大家成为大神,需要深层掌握协议时,再去了解也不迟 - TCP/IP:传输控制协议/因特网互联协议
初学者不要太纠结这个东西,协议也可以理解为约定,就是大家都遵守的一种东西。
比如开车要靠右,就是让道路变得有条有序,TCP/IP协议的目的就是让传输数据变得有条有序 - Socket和TCP/IP关系
TCP/IP是一种协议,Sokect是遵循这种协议做传输数据的一个工具。
例如:你只知道开车靠右,但是没车,你还是不能运输东西,不是吗?Socket就像遵循开车靠右 (TCP/IP协议) 的车
正式内容
服务端代码
static void Main(string[] args)
{
IPAddress ip = IPAddress.Parse("127.0.0.1");
#region 端口
//端口号的范围从0到65535,建议自己写程序设置端口,都大于3000小于65535,
//因为windows很多默认程序都小于3000,这样可以避免不必要的端口冲突。
#endregion
IPEndPoint ipe = new IPEndPoint(ip, 5001);
//1.建立一个Socket对象
Socket socketServer = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
//2.Socket关联到这个IP上面
socketServer.Bind(ipe);
#region 3.开始监听这个IP是否有客户端连接
//Listen参数:同时有多台客户端连接服务器时,最多允许排队等待的客户端数量
#endregion
//最多允许8个客户端排队等待(这个数值建议小于30)
socketServer.Listen(8);
Console.WriteLine("正在监听...");
//接收发送连接信息的客户端(一直等待客户端连接,不继续执行)
Socket acceptSocket = socketServer.Accept();
Console.WriteLine("连接成功!!");
string message = string.Empty;
byte[] receiveBytes = new byte[2048];
//服务端会一直等待客户端发送消息,否则不继续执行
int byteLen = acceptSocket.Receive(receiveBytes, receiveBytes.Length, 0);
message += Encoding.UTF8.GetString(receiveBytes, 0, byteLen);
Console.WriteLine("客户端消息:" + message);
//发送消息给客户端
string sendMessage = "Hi Boy,I am SocketServer!";
byte[] sendBytes = Encoding.UTF8.GetBytes(sendMessage);
acceptSocket.Send(sendBytes, sendBytes.Length, 0);
//释放Socket占用的资源
acceptSocket.Dispose();
socketServer.Dispose();
Console.ReadKey();
}
客户端代码
static void Main(string[] args)
{
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint ipe = new IPEndPoint(ip, 5001);
//1.建立一个Socket对象
Socket socketClient = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
try
{
//2.去连接这个IP(没有Socket监听这个端口,就会报错)
socketClient.Connect(ipe);
Console.WriteLine("连接服务端" + ipe + "成功");
//发送信息给服务端
string sendMessage = "Hello SocketServer,I am SocketClient.";
byte[] sendBytes = Encoding.UTF8.GetBytes(sendMessage);
socketClient.Send(sendBytes);
//接收信息
string receiveMessage = "";
byte[] receiveBytes = new byte[2048];
//客户端会一直等待服务器发送消息,否则不继续执行
int byteLen = socketClient.Receive(receiveBytes,
receiveBytes.Length, 0);
receiveMessage += Encoding.UTF8.GetString(receiveBytes, 0, byteLen);
Console.WriteLine("服务器信息:" + receiveMessage);
//释放Socket占用的资源
socketClient.Dispose();
Console.ReadKey();
}
catch (Exception)
{
throw;
}
}
总结
注意:先运行服务端,再运行客户端。
这样简单的Socket通讯,在C#中就算完成了。
但是你会发现,服务端只能连接一个客户端,而且发送的内容都是写死的。
期待和Socket的再次遇。。。。