csharp,using System;,using System.Net;,using System.Net.Sockets;,using System.Text;class Program,{, static void Main(), {, IPAddress ip = IPAddress.Parse("127.0.0.1");, int port = 8080;, TcpListener server = new TcpListener(ip, port);, server.Start();, Console.WriteLine("Server started..."); while (true), {, TcpClient client = server.AcceptTcpClient();, NetworkStream stream = client.GetStream();, byte[] buffer = new byte[1024];, int bytesRead = stream.Read(buffer, 0, buffer.Length);, string request = Encoding.UTF8.GetString(buffer, 0, bytesRead);, Console.WriteLine("Received: " + request); string response = "Hello from server";, byte[] responseBytes = Encoding.UTF8.GetBytes(response);, stream.Write(responseBytes, 0, responseBytes.Length); client.Close();, }, },},
“
using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;
class SocketServer { private static int port = 12345; // 服务器监听的端口号 private static TcpListener server; static void Main(string[] args) { StartServer(); } public static void StartServer() { try { // 初始化TcpListener对象 server = new TcpListener(IPAddress.Any, port); server.Start(); Console.WriteLine("服务器已启动,正在监听端口:" + port); while (true) { // 等待客户端连接 TcpClient client = server.AcceptTcpClient(); Console.WriteLine("客户端已连接:" + client.Client.RemoteEndPoint); // 创建一个新的线程来处理客户端请求 Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); clientThread.Start(client); } } catch (SocketException se) { Console.WriteLine("SocketException: " + se); } } public static void HandleClientComm(object obj) { TcpClient client = (TcpClient)obj; NetworkStream stream = client.GetStream(); byte[] bytes = new byte[256]; string data = null; while ((data = ReadData(stream)) != null) { ASCIIEncoding ascii = new ASCIIEncoding(); byte[] sendBytes = ascii.GetBytes(data); stream.Write(sendBytes, 0, sendBytes.Length); } client.Close(); } private static string ReadData(NetworkStream stream) { byte[] bytes = new byte[256]; StringBuilder builder = new StringBuilder(); int bytesRead = 0; do { bytesRead = stream.Read(bytes, 0, bytes.Length); builder.AppendFormat("{0}", Encoding.ASCII.GetString(bytes, 0, bytesRead)); } while (stream.DataAvailable); return builder.ToString(); } }
命名空间引用:引入了System
、System.Net
、System.Net.Sockets
、System.Text
和System.Threading
等命名空间,这些是使用Socket编程所必需的。
服务器端类定义:定义了一个名为SocketServer
的类,其中包含了服务器端的主要逻辑。
主函数:在Main
方法中调用StartServer
方法来启动服务器。
启动服务器:在StartServer
方法中,首先初始化一个TcpListener
对象,并绑定到指定的IP地址(这里是IPAddress.Any
表示所有可用的网络接口)和端口号(这里设置为12345),然后调用Start
方法开始监听客户端连接,通过一个无限循环,不断接受客户端连接,并为每个连接创建一个新线程来处理客户端通信,这样可以同时处理多个客户端连接。
处理客户端通信:在HandleClientComm
方法中,获取与客户端连接的NetworkStream
对象,用于读写数据,通过一个循环不断读取客户端发送的数据,并将其回显给客户端,当客户端关闭连接或没有更多数据可读时,退出循环并关闭客户端连接。
读取数据:ReadData
方法用于从NetworkStream
中读取数据,将其转换为字符串并返回,这里使用了一个简单的循环来读取所有可用的数据,直到没有更多数据可读为止。
将上述代码保存为一个.cs
文件,例如SocketServer.cs
,然后在命令行中导航到该文件所在的目录,使用csc SocketServer.cs
命令编译代码,生成一个可执行文件SocketServer.exe
,运行该可执行文件,服务器将开始监听指定端口上的客户端连接。
问题1:如何修改服务器监听的端口号?
答:可以通过修改代码中的port
变量的值来更改服务器监听的端口号,将private static int port = 12345;
改为private static int port = 8080;
即可将服务器监听的端口号修改为8080。
问题2:如何处理多个客户端同时连接的情况?
答:如上述代码所示,在StartServer
方法中使用多线程来处理客户端连接,每当有新的客户端连接时,就创建一个新的线程来处理该客户端的通信,这样可以实现多个客户端同时与服务器进行交互,而不会相互阻塞,不过需要注意的是,多线程编程可能会带来一些并发问题,如资源共享冲突等,因此在实际应用中需要进行适当的同步和错误处理。
就是一个简单的C# Socket服务器端代码示例及其相关说明,通过这个示例,你可以了解到如何使用C#编写一个基本的Socket服务器程序,实现与客户端的基本通信功能,实际的Socket编程可能会更加复杂,涉及到更多的功能和异常处理,希望这个示例能为你提供一个良好的起点,帮助你进一步学习和掌握C# Socket编程。