csharp,using System;,using System.Net;,using System.Net.Sockets;,using System.Text;class Program,{, static void Main(), {, // 创建Socket对象, Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 连接到服务器, client.Connect(IPAddress.Parse("127.0.0.1"), 8080); // 发送数据, string message = "Hello, Server!";, byte[] data = Encoding.ASCII.GetBytes(message);, client.Send(data); // 接收数据, byte[] buffer = new byte[1024];, int received = client.Receive(buffer);, string response = Encoding.ASCII.GetString(buffer, 0, received);, Console.WriteLine("Received: " + response); // 关闭连接, client.Shutdown(SocketShutdown.Both);, client.Close();, },},
“
1、引用命名空间
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
2、创建服务器端类
创建一个名为Server
的类,包含主方法Main
以及用于启动服务器、接受客户端连接和接收数据的方法。
3、启动服务器
在Main
方法中,创建一个TcpListener
对象,指定监听的IP地址和端口号,监听本地主机的8000端口。
调用TcpListener
的Start
方法开始监听。
使用Console.WriteLine
输出服务器已启动的信息。
4、接受客户端连接
在一个循环中,调用TcpListener
的AcceptTcpClient
方法等待客户端连接,该方法会阻塞线程,直到有客户端连接。
当有客户端连接时,创建一个新的线程来处理该客户端的请求,以便服务器可以同时处理多个客户端,在线程中,获取与客户端通信的NetworkStream
对象。
5、接收数据
从NetworkStream
中读取数据,可以使用StreamReader
来方便地读取字符串数据。
将接收到的数据输出到控制台。
6、发送数据
使用StreamWriter
向客户端发送数据,发送一个确认消息给客户端。
7、关闭连接
处理完客户端请求后,关闭NetworkStream
和TcpClient
对象,释放资源。
1、引用命名空间
与服务器端相同的命名空间。
2、创建客户端类
创建一个名为Client
的类,包含主方法Main
以及用于连接到服务器、发送数据和接收数据的方法。
3、连接到服务器
在Main
方法中,创建一个TcpClient
对象,指定服务器的IP地址和端口号,连接到本地主机的8000端口。
调用TcpClient
的Connect
方法建立与服务器的连接。
4、发送数据
获取与服务器通信的NetworkStream
对象。
使用StreamWriter
向服务器发送数据,发送一条消息给服务器。
5、接收数据
使用StreamReader
从服务器接收数据。
将接收到的数据输出到控制台。
6、关闭连接
处理完与服务器的交互后,关闭NetworkStream
和TcpClient
对象,释放资源。
using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; class Server { static void Main(string[] args) { TcpListener listener = null; try { // 设置IP地址和端口号 IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); int port = 8000; // 创建TCP监听器 listener = new TcpListener(ipAddress, port); listener.Start(); Console.WriteLine("服务器已启动,等待客户端连接..."); while (true) { // 接受客户端连接 TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("客户端已连接"); // 创建线程处理客户端请求 Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); clientThread.Start(client); } } catch (SocketException se) { Console.WriteLine("SocketException: {0}", se); } finally { if (listener != null) { listener.Stop(); } Console.WriteLine("服务器已停止"); } } public static void HandleClientComm(object client) { TcpClient tcpClient = (TcpClient)client; NetworkStream clientStream = tcpClient.GetStream(); // 接收数据 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = clientStream.Read(buffer)) != 0) { string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine("收到来自客户端的数据: " + receivedData); // 发送数据 string response = "数据已接收"; byte[] dataToSend = Encoding.UTF8.GetBytes(response); clientStream.Write(dataToSend, 0, dataToSend.Length); } // 关闭连接 clientStream.Close(); tcpClient.Close(); } }
using System; using System.Net.Sockets; using System.Text; using System.Threading; class Client { static void Main(string[] args) { TcpClient client = null; try { // 设置服务器的IP地址和端口号 IPAddress serverIp = IPAddress.Parse("127.0.0.1"); int serverPort = 8000; client = new TcpClient(serverIp, serverPort); Console.WriteLine("已连接到服务器"); // 发送数据 NetworkStream stream = client.GetStream(); string message = "你好,服务器!"; byte[] dataToSend = Encoding.UTF8.GetBytes(message); stream.Write(dataToSend, 0, dataToSend.Length); Console.WriteLine("已发送数据: " + message); // 接收数据 byte[] buffer = new byte[1024]; int bytesRead = stream.Read(buffer); string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine("收到来自服务器的响应: " + receivedData); } catch (SocketException se) { Console.WriteLine("SocketException: {0}", se); } finally { if (client != null) { client.Close(); } } } }
1、如何确保服务器能够同时处理多个客户端连接?
在服务器端代码中,当接受一个客户端连接后,创建一个新的线程来处理该客户端的请求,这样,服务器的主线程可以继续接受其他客户端的连接,从而实现同时处理多个客户端的功能,通过这种方式,每个客户端连接都在自己的线程中进行处理,互不干扰。
2、如果服务器需要处理大量并发客户端连接,有没有更好的解决方案?
对于处理大量并发客户端连接的情况,可以考虑使用异步编程模型或更高级的并发处理机制,如使用async
和await
关键字进行异步操作,或者使用任务并行库(TPL)来更有效地管理线程资源,还可以使用一些高性能的网络编程框架,如SignalR等,这些框架提供了更高效的并发处理能力和更丰富的功能,适用于大规模的网络应用程序开发。