C#有没有一种简单的方法可以进入TCP套接字编程?
我曾经做过一个程序,它使用数据库将小消息从一台电脑发送到另一台电脑。我所做的是把数据库放在一个共享文件夹中,让另一台电脑上的程序连接到它(通过一个路径,不少于),这是一个简单易行的方法,可以在网络上的电脑之间传递信息。这不是最好的选择,但这只是家庭作业,快速而肮脏的方法给了我一个分数 但是现在家庭作业已经完成了,我想在我所做的基础上有所改进。程序的问题在部署阶段。有太多的文件夹/安装路径和管理/共享问题,涉及直接路径到共享文件夹上的数据库 所以stackoverflow的好人建议我试试Socket编程,我觉得这有点不适合我。但你永远不知道 另外,我知道同步和异步套接字编程之间的区别。一个街区,另一个没有。我正在做的程序是一个简单的回合制游戏,所以我认为同步可能足够好,因为如果不是轮到你,你真的什么都做不了。然而,问题是该程序被视为“无响应”。我尝试过异步,但遇到线程问题,我认为这不是我的主意。 从逻辑上讲,这个程序很简单。一台主机,一台客户端。在客户端连接时,主机发送数据。然后客户端接收、发送自己的数据。以此类推,直到一个玩家输 很抱歉,我的学校只安装了.NET2.0。没有WCF什么的。而且,它必须在C#Windows窗体中完成,因此XNA已退出 所以,我想问。。。有没有一种简单的方法可以进入Socket编程?是否有任何指南/示例项目可以提供帮助?可以研究和修改的预制代码C#有没有一种简单的方法可以进入TCP套接字编程?,c#,.net,sockets,C#,.net,Sockets,我曾经做过一个程序,它使用数据库将小消息从一台电脑发送到另一台电脑。我所做的是把数据库放在一个共享文件夹中,让另一台电脑上的程序连接到它(通过一个路径,不少于),这是一个简单易行的方法,可以在网络上的电脑之间传递信息。这不是最好的选择,但这只是家庭作业,快速而肮脏的方法给了我一个分数 但是现在家庭作业已经完成了,我想在我所做的基础上有所改进。程序的问题在部署阶段。有太多的文件夹/安装路径和管理/共享问题,涉及直接路径到共享文件夹上的数据库 所以stackoverflow的好人建议我试试Socke
我发现并改编的大多数示例都是聊天应用程序,我认为这已经足够好了,但将其模块化只会破坏它。我创建了一些类,可以使用
二进制格式化程序通过套接字传输对象
下面是我的BinaryTransport
类的一些测试:
实际类别:
请注意,我是很久以前写的。我只是注意到一些小虫子。但是,要么使用它们,要么只是学习课程来了解更多 您遇到的聊天应用程序示例应该足够了。我不清楚你所说的“模块化”
您需要的是设计一个通过连接发送的协议,可以说是一个规则协议,以便一方知道另一方在谈论什么。因此,您可以发送以下内容,而不是发送纯文本(聊天):
0x03(消息长度)
0x0A(此虚构协议中的移动命令)
0x02(命令的参数1,在本例中为X坐标,在协议设计中定义)
0x05(命令的参数2,在本例中为Y坐标,在协议设计中定义)
现在完全取决于您在接收和解释数据后会发生什么。就我个人而言,我会选择异步解决方案,因为它让您的程序去做其他事情(图形?)。根据我的经验,它在代码上更容易适应。我记得当我开始使用C#中的套接字通信时,我尝试在客户端和服务器之间,然后在多个客户端之间实现一个简单的聊天程序。以下是我当时正在阅读的教程:
如果你想要完整的代码,我可以上传我的最终项目,你可以研究代码。它还使用多线程,因此您可以看到如何在GUI应用程序中处理这种情况
旁注:哇,这个数据库的想法是我在PC到PC通信方面见过的最疯狂的事情。干得好 一个有趣、有用且简单的练习是创建一个基于TCP的记录器,你可以学习Socket(C#使之更容易)
在开发过程中,每一个程序员都需要一种方法来知道在某些点上幕后发生了什么。如果没有记录器,您通常会编写以下内容:
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中使用它。阅读名称空间的文档。如果您正在努力解决线程签出BackgroundWorker类的复杂性,它可以简化一些事情。您可以考虑另一个选项:非阻塞套接字,它允许您轮询“当前线程”上的传入数据。这可能会花费一点性能,但我怀疑任何玩家都不会注意到。你们学校只有.NET2.0吗?我讨厌看到学校不让学生为外面的事情做好准备……+1感谢他们回来学习如何以一种不那么“疯狂”的方式做这件事!抱歉,我没有清除“模块化”部分。我觉得时间太长了。看,我研究和改编的聊天应用程序使用异步,我相信。我能理解。这相对简单。但是,我的程序在发送字符串之前和接收字符串之后调用几个函数,这些函数根据接收到的字符串应用GUI更改,并根据GUI上按下的内容修改要发送的字符串。这就是程序(主要是线程)失败的地方。因此,您需要控制接收消息的时间。这可以通过实现类消息的队列来实现,其中消息包含数据i