下面是如何基于C#使用Socket编写一个局域网聊天工具的完整攻略。
1. 确定聊天工具功能
在开发之前,我们需要明确自己需要实现哪些功能。一个基本的局域网聊天工具需要完成的功能有:连接、发送、接收、断开、修改昵称等操作。
2. 基本架构
想要实现局域网聊天工具,需要先了解Socket编程的基本原理。需要使用TcpListener和TcpClient来建立连接、发送和接收信息。其中,TcpListener负责监听端口,接收来自TcpClient的连接请求并为每个连接请求创建新的TcpClient;TcpClient则负责与TcpListener建立连接,并且负责发送和接收信息。
基于此,我们可以采用如下基本的程序架构:
- 建立Socket Server端,监听端口;
- 客户端Socket向Server端的IP和端口发送连接请求;
- Server端接收到客户端的连接请求后,为该连接请求创建一个新的TcpClient,并记录下该连接的信息(如客户端IP地址,所分配的端口号);
- 客户端和Server端通过TcpClient之间进行数据交换(如发送和接收聊天信息);
- 如果客户端或Server端断开了连接,则需要释放相应的资源。
3. 实现具体功能
3.1 建立Server端
首先,创建一个TcpListener对象,指定IP和监听端口,用于监听来自客户端的连接请求。在接收到连接请求后,需要为每个连接请求创建一个新的TcpClient,并将TcpClient对象存储在一个List中。为了防止线程的死锁,需要使用异步执行accept()方法的方式来接收连接请求。
TcpListener server = new TcpListener(IPAddress.Parse(serverIP), port);
server.Start();
while (true)
{
TcpClient client = await server.AcceptTcpClientAsync();
clients.Add(client);
}
3.2 建立Client端
客户端需要通过TcpClient对象与服务端建立连接。在连接成功之后,客户端需要向服务端发送消息,并等待服务端的回应。
TcpClient client = new TcpClient(serverIP, port);
while (true)
{
string message = Console.ReadLine(); //从控制台读入信息
//将消息转化为byte数组
byte[] data = Encoding.UTF8.GetBytes(message);
//发送
client.GetStream().Write(data, 0, data.Length);
}
3.3 接收和发送信息
客户端和服务端可以通过TcpClient.GetStream()方法来进行数据交换。在接收信息时,需要使用StreamReader对象来读取TcpClient对象流中的信息,转换为字符串后进行进一步处理。
while (true)
{
//获取TcpClient对象流中的字符串
StreamReader reader = new StreamReader(client.GetStream());
//如果从reader中读取到了数据
if (reader.Peek() != -1)
{
string message = reader.ReadLine();
Console.WriteLine(message); //将消息输出到控制台
}
}
在发送信息时,需要将信息转化为byte数组,并使用TcpClient对象的Write()方法将信息发送至服务端。
while (true)
{
string message = Console.ReadLine(); //从控制台读入信息
//将消息转化为byte数组
byte[] data = Encoding.UTF8.GetBytes(message);
//发送
client.GetStream().Write(data, 0, data.Length);
}
3.4 断开连接
在Socket编程中,需要手动释放所有已经创建的TcpClient对象,以保证资源的释放。关闭客户端或服务端时,需要先关闭其对应的TcpClient对象,并将该TcpClient对象从存储TcpClient对象的List中移除,最后再关闭TcpListener对象。
//关闭当前TcpClient
client.Close();
//在存储所有TcpClient的List中移除当前TcpClient
clients.Remove(client);
//关闭TcpListener
server.Stop();
4. 示例说明
4.1 示例1:搭建简单的服务端
class Program
{
static List<TcpClient> clients = new List<TcpClient>(); //存储所有TcpClient的List
//建立服务端
static async Task Main(string[] args)
{
//指定服务端IP和端口号
string serverIP = "127.0.0.1";
int port = 8888;
//创建TcpListener对象,用于监听来自客户端的连接请求
TcpListener server = new TcpListener(IPAddress.Parse(serverIP), port);
server.Start();
Console.WriteLine("Server is running...");
while (true)
{
//异步接收连接请求
TcpClient client = await server.AcceptTcpClientAsync();
//将客户端连接的TcpClient对象存储进clients List中
clients.Add(client);
//输出已连接客户端的IP地址和端口号
Console.WriteLine("Connection accepted from " + client.Client.RemoteEndPoint.ToString());
}
}
}
4.2 示例2:连接客户端
class Program
{
//建立客户端连接
static async Task Main(string[] args)
{
//指定服务端IP和端口号
string serverIP = "127.0.0.1";
int port = 8888;
Console.WriteLine("Connecting to server...");
//创建TcpClient对象,连接服务端
TcpClient client = new TcpClient(serverIP, port);
Console.WriteLine("Connected to server.");
while (true)
{
//从控制台读取信息
string message = Console.ReadLine();
//将信息转化为byte数组
byte[] data = Encoding.UTF8.GetBytes(message);
//发送信息
client.GetStream().Write(data, 0, data.Length);
}
}
}
这两个示例只是局域网聊天工具的基础,可以在此基础上添加更多的功能,如修改昵称,发送文件等。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于c#用Socket做一个局域网聊天工具 - Python技术站