2

抱歉,这个问题非常广泛,但我很想得到答案。

对于一个想法,我希望一台计算机在本地网络上启动服务器,并让另一台计算机连接到该服务器以交换数据。

我的问题是如何做到这一点?

作为一个附加问题,有人有关于 System.net 类参考的好教程吗?

4

2 回答 2

2

一种解决方案是使用套接字。对于服务器套接字,您创建一个套接字,然后调用 bind、listen 和 accept。这可以异步完成,也可以通过阻塞线程来完成。

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Any, port));
server.Listen(3);
Socket client = server.Accept();

现在,client是连接到已连接计算机的连接。现在您可以使用 Send 方法在两者之间实际发送数据。

string message = "hello there";
byte[] bytes = Encoding.UTF8.GetBytes(message);
byte[] lengthBytes = BitConverter.GetBytes(bytes.Length);
client.Send(lengthBytes);
client.Send(bytes);

使用 lengthbytes 是因为其他客户端可能不知道我们为“完整消息”传输了多少字节,所以我们简单地告诉它。

另一方面,客户端使用 Connect 方法连接到正在运行的服务器,并使用 Recive 获取从服务器发送的字节。

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), port));
byte[] lengthBytes = new byte[4];
socket.Receive(lengthBytes);
int length = BitConverter.GetInt32(lengthBytes);
byte[] messageBytes = new byte[length];
socket.Receive(messageBytes);
string message = Encoding.UTF8.GetString(messageBytes);
Console.WriteLine(message);

顺便说一句,发送和接收双向工作。

不过,这只是表面现象。野外有很多资源可以解决这个问题,但也许这可以成为你的垫脚石。例如,您可以查看SocketAsyncEventArgs用于异步通信的类,而不是在调用 Receive 时阻塞线程。

您还应该研究用户提供的数据的卫生情况。请记住,“长度”是用户提供的,因为它在我们刚刚定义的协议中。我们不能告诉服务器总是发送正确的数据,它还不如发送 -1 当我们尝试分配时这将是不好的new byte[length]。数据的清理或验证是必要的,这样客户端就不会在我们自己的计算机上崩溃或做坏事。

于 2012-10-25T14:42:59.040 回答
0

我认为这个链接是你应该开始的。这篇文章非常基础,但当有人不知道从哪里开始时,我经常推荐它。当然,您将不得不处理一些问题,例如停止服务器等,但它会为您指明进一步搜索的方向。

于 2012-10-25T14:44:27.150 回答