我需要一些帮助来理解这个 C# 套接字代码
I need some help understanding this C# socket code
我目前正在尝试使用 C# 学习网络连接,我直接从套接字开始。
我现在阅读了一些指南,我找到了一个比较好且易于理解的指南,但现在他们为我提供了服务器套接字的代码,我在理解某些段落时遇到了一些困难
代码:
public void startServer()
{
TcpListener serverSocket = new TcpListener(8888);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
Console.WriteLine(" >> Server Started");
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine(" >> Accept connection from client");
while ((true))
{
try
{
NetworkStream networkStream = clientSocket.GetStream();
byte[] bytesFrom = new byte[10025];
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
Console.WriteLine(" >> Data from client - " + dataFromClient);
string serverResponse = "Last Message from client" + dataFromClient;
Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
Console.WriteLine(" >> " + serverResponse);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
clientSocket.Close();
serverSocket.Stop();
Console.WriteLine(" >> exit");
Console.ReadLine();
}
首先,一开始发生的事情很明显。正在创建一个 TcpListener,它代表服务器套接字。
但是,有些混乱是从 TcpClient 部分开始的。如果这应该是一个服务器,为什么我必须在这里创建一个客户端?考虑到服务器应该 运行 独立,服务器和客户端方法不应该分开吗?
那么,在try catch中,为什么是NetworkStream = clientsocket.GetStream();
呢?我在这里可能完全错了,但为什么我必须从我的客户那里获取流?此行听起来像是服务器在等待定期更新。或者是要传输的信息/消息被存储在客户端,直到服务器 "collects" 呢?
字节数组应该存储一条消息,这是我很确定的。
我真的不能对 try 块中的其他语句说太多,只要我仍然对其他部分感到困惑。但总的来说,服务器似乎正在与客户端建立连接,并且 transmitting/receiving 消息是双向的。
我在网络或套接字技术方面并不是很先进(老实说,一点也不先进,我才刚刚开始),所以如果我在这里做了一些错误的假设,我很抱歉,但我真的试图在没有任何解释的情况下获取这段代码。
如果有人能帮我解决这段代码,我将不胜感激。
客户这个词有两个定义。在应用程序级别,您有一个客户端和服务器应用程序。客户端为主,服务器为从。在套接字层,客户端应用程序和服务器应用程序都有一个客户端(也称为套接字)。
服务器套接字侦听环回地址 127.0.0.1(或 IPAny)。当客户端套接字连接到服务器 IP 地址时。
对我来说看起来像是一个混合解决方案。
通常 TcpListener listener = new TcpListener(8888)
等待给定端口上的连接。
然后,当它接受来自客户端的连接时,它会在不同的套接字上建立连接Socket socket = listener.AcceptSocket()
,以便监听端口保持等待其他连接(另一个客户端)。
然后,我们可以从流中连接到服务器的客户端读取:Stream stream = NetworkStream(socket)
。
TcpClient
用于连接到此类服务器,它应该在客户端应用程序中使用,而不是在服务器一中使用。
我目前正在尝试使用 C# 学习网络连接,我直接从套接字开始。
我现在阅读了一些指南,我找到了一个比较好且易于理解的指南,但现在他们为我提供了服务器套接字的代码,我在理解某些段落时遇到了一些困难
代码:
public void startServer()
{
TcpListener serverSocket = new TcpListener(8888);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
Console.WriteLine(" >> Server Started");
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine(" >> Accept connection from client");
while ((true))
{
try
{
NetworkStream networkStream = clientSocket.GetStream();
byte[] bytesFrom = new byte[10025];
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
Console.WriteLine(" >> Data from client - " + dataFromClient);
string serverResponse = "Last Message from client" + dataFromClient;
Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
Console.WriteLine(" >> " + serverResponse);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
clientSocket.Close();
serverSocket.Stop();
Console.WriteLine(" >> exit");
Console.ReadLine();
}
首先,一开始发生的事情很明显。正在创建一个 TcpListener,它代表服务器套接字。
但是,有些混乱是从 TcpClient 部分开始的。如果这应该是一个服务器,为什么我必须在这里创建一个客户端?考虑到服务器应该 运行 独立,服务器和客户端方法不应该分开吗?
那么,在try catch中,为什么是NetworkStream = clientsocket.GetStream();
呢?我在这里可能完全错了,但为什么我必须从我的客户那里获取流?此行听起来像是服务器在等待定期更新。或者是要传输的信息/消息被存储在客户端,直到服务器 "collects" 呢?
字节数组应该存储一条消息,这是我很确定的。
我真的不能对 try 块中的其他语句说太多,只要我仍然对其他部分感到困惑。但总的来说,服务器似乎正在与客户端建立连接,并且 transmitting/receiving 消息是双向的。
我在网络或套接字技术方面并不是很先进(老实说,一点也不先进,我才刚刚开始),所以如果我在这里做了一些错误的假设,我很抱歉,但我真的试图在没有任何解释的情况下获取这段代码。
如果有人能帮我解决这段代码,我将不胜感激。
客户这个词有两个定义。在应用程序级别,您有一个客户端和服务器应用程序。客户端为主,服务器为从。在套接字层,客户端应用程序和服务器应用程序都有一个客户端(也称为套接字)。 服务器套接字侦听环回地址 127.0.0.1(或 IPAny)。当客户端套接字连接到服务器 IP 地址时。
对我来说看起来像是一个混合解决方案。
通常 TcpListener listener = new TcpListener(8888)
等待给定端口上的连接。
然后,当它接受来自客户端的连接时,它会在不同的套接字上建立连接Socket socket = listener.AcceptSocket()
,以便监听端口保持等待其他连接(另一个客户端)。
然后,我们可以从流中连接到服务器的客户端读取:Stream stream = NetworkStream(socket)
。
TcpClient
用于连接到此类服务器,它应该在客户端应用程序中使用,而不是在服务器一中使用。