C#是否有一种简单的方法进入TCP套接字编程?

7
我曾经做过一个程序,使用数据库将小消息从一台电脑发送到另一台电脑。我的做法是把数据库放在共享文件夹中,让另一台电脑通过路径连接它,这样就可以简单方便地在网络上的电脑之间传递消息了。虽然不是最好的选择,但只是作业,快速而粗略的方式使我得到了好成绩。
但现在作业已经完成,我想改进我的做法。这个程序的问题出在部署阶段。直接连接共享文件夹上的数据库会涉及太多的文件夹/安装路径和管理/共享问题。
所以stackoverflow上的热心网友建议我尝试Socket编程,但我觉得这有点超出了我的能力范围。不过谁知道呢...
此外,我也知道同步和异步socket编程之间的区别。其中一个会阻塞,另一个则不会。我正在开发的程序是一个简单的回合制游戏,因此我认为同步可能足够了,因为如果轮到你的回合,你确实无法做任何事情。然而,问题在于该程序被视为“无响应”。我尝试过异步,但遇到了线程问题,我觉得这远远超出了我的能力范围。
从逻辑上讲,程序很简单。一个主机,一个客户端。客户端连接后,主机发送数据。然后客户端接收、发送自己的数据。这样一直持续下去,直到其中一个玩家输掉比赛。
很遗憾,我学校只安装了.NET 2.0。没有WCF或其他任何东西。而且必须使用C# Windows Forms完成,所以XNA不行。
那么,我想问一下...有没有一个简单的方法来进行Socket编程?有没有可以帮助的指南/示例项目?可以学习和调整的预先制作的代码?
我找到并修改的大部分示例都是聊天应用程序,我觉得这足够好,但将其变成模块化的程序就会出问题。

1
阅读 System.Net.Sockets 命名空间的文档。 - Oded
如果您在处理线程复杂性时感到困难,请查看BackgroundWorker类http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx,它可以简化一些事情。 - Ben Robinson
还有另一种选择,您可以考虑使用非阻塞套接字,在“当前线程”上轮询传入数据。这可能会稍微降低一点性能,但我怀疑任何玩家都不会注意到。 - C.Evenhuis
1
你们学校只用.NET 2.0?我不喜欢看到学校没有为学生做好面对外部世界的准备... - Polity
2
+1 回来学习如何以不那么“疯狂”的方式完成它! - spender
是的,第一个回复我的上一个问题是“你正在做的是疯狂的!” - zack_falcon
4个回答

1
你遇到的聊天应用程序示例应该足够了。我不清楚你所说的“使其模块化”是什么意思。
你需要设计一个协议来通过连接发送,就像一种规则协议,这样每个人都知道对方在谈论什么。因此,你可以发送以下内容而不是纯文本(聊天):

0x03(消息长度)
0x0A(在这个虚构协议中的移动命令)
0x02(命令的参数1,在这种情况下是X坐标,所有这些都在协议设计中定义)
0x05(命令的参数2,在这种情况下是Y坐标,所有这些都在协议设计中定义)
现在完全取决于你接收和解释数据后会发生什么。个人而言,我会选择异步解决方案,因为它可以让你的程序做其他事情(图形?)。根据我的经验,它更容易适应代码。

抱歉,我没有澄清“模块化”部分。我觉得会太长了。你看,我研究和改编的聊天应用程序使用了Async,我相信这个我能理解。它相对来说比较简单。然而,在发送和接收字符串之前,我的程序调用了几个函数,这些函数基于接收到的字符串应用GUI更改,并根据在GUI上按下的内容修改要发送的字符串。正是在这里,程序(主要是线程)出现了问题。 - zack_falcon
所以你需要控制何时接收消息。这可以通过实现一个 Message 类的队列来完成,其中 Message 包含由回调函数解释的数据。因此,在每个回调函数中,您都会解析传入的消息并将它们排队。然后,当需要查看是否已接收到任何消息时,您只需在队列中查找即可。 - loconero

0

0

我还记得当我开始使用C#进行套接字通信时,我尝试实现一个简单的客户端和服务器之间以及多个客户端之间的聊天程序。这是我当时正在阅读的教程:http://www.codeproject.com/KB/IP/TCPIPChat.aspx

如果您想要完整的代码,我可以上传我的最终项目,您可以研究一下代码。它还使用了多线程,因此您可以看到如何在GUI应用程序中处理此情况。

顺便说一句:哇,那个数据库的想法是我见过的关于PC对PC通信最疯狂的事情。干得好!


我也是基于聊天应用程序开发了我的程序,尽管我的成功相对有限。你正在开发什么样的项目? - zack_falcon
它也是一个聊天应用程序,但具有服务器路由多个客户端之间的消息。 - Tudor

0
一个有趣、有用且容易的练习,可以帮助你学习套接字(C# 使其更容易),那就是创建基于 TCP 的记录器。
在开发过程中,每个程序员都需要一种了解某些点下发生的情况的方法。如果没有记录器,你通常会写出类似以下的代码:
Console.WriteLine( "blah" );

这会导致输出窗口中出现一个单调、未过滤、未组织的字符串。

我使用套接字很容易地创建了一个基于TCP的记录器。一方面,你有一个独立的Winforms应用程序(服务器),负责监听传入的消息并在富内容控件上美观地显示它们。另一方面,你编写一个非常简单的类(客户端),只有一个函数:

public static class MyConsole
{
    public static void WriteLine( string message, string whatever )
    {
        // send to the net
        if( mTcpSocket.Connected )
            mTcpSocket.Send( message );

        // in case the server is not there we still have regular output
        Console.WriteLine( message );
    }
}

我曾经创建了这个日志记录器并一直在使用它。此外,由于它的 TCP 特性,在服务器端进行微小的更改后,我已成功地从不同的编程语言中使用它,如 C# 和 Java,并且现在正在使用 ActionScript。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接