C#有一种简单的方法可以进入TCP套接字编程吗?

时间:2011-11-25 09:27:16

标签: c# .net sockets

我参与了一个使用数据库从一台PC向另一台PC发送小消息的程序。我所做的是将数据库放在一个共享文件夹中,让另一台PC上的程序连接到它(通过Path,不能少),这就是一种简单易用的方法来获取来回PC的消息在网络上。不是最好的选择,但它只是功课,快速而肮脏的方法让我得到了成绩。

但是现在完成了家庭作业,我想改进我的所作所为。该程序的问题是在部署阶段。有关直接路由到共享文件夹上的数据库的文件夹/安装路径和管理/共享问题太多。

所以stackoverflow中的优秀人员建议我尝试套接字编程,我认为这有点超出了我的联盟。但你永远不知道......

另外,我知道Sync和Async套接字编程之间的区别。一个街区,另一个街区没有。我正在研究的程序是一个简单的回合制游戏,所以我认为Synchronous可能已经足够好了,因为如果轮到你了,你真的无能为力。然而,问题是该计划被视为“没有回应”。我试过异步,但遇到了线程问题,我认为这是我的联盟。

逻辑上,程序很简单。一个主机,一个客户端。在客户端连接时,主机发送数据。然后客户端接收,发送自己的数据。等等,直到一个玩家输了。

我很遗憾地说我的学校只安装了.NET 2.0。没有WCF或任何东西。此外,它必须在C#Windows窗体中完成,因此XNA已经用完了。

所以,我想问......是否有一种简单的方法可以进入套接字编程?任何可以提供帮助的指南/示例项目?预制代码可以研究和调整吗?

我发现和改编的大多数样本都是聊天应用程序,我认为这些应用程序已经足够好了,但是将其模块化只会打破它。

4 个答案:

答案 0 :(得分:1)

您遇到的聊天应用程序示例应该足够了。我不清楚你所说的“模块化”。

你需要的是设计一个通过连接发送的协议,这是一个规则协议,以便人们知道对方在谈论什么。因此,您可以发送以下内容,而不是发送纯文本(聊天):

0x03(消息长度)
0x0A(在这个虚构协议中移动命令)
0x02(命令的参数1,在这种情况下为X坐标,它全部在协议设计中定义)
0x05(命令的参数2,在这种情况下是Y坐标,它都在协议设计中定义)

现在完全取决于您收到并解释数据后会发生什么。我个人会去Async解决方案,因为它让你的程序做其他事情(图形?)。根据我的经验,它更容易适应代码。

答案 1 :(得分:0)

我已经创建了一些类,可以使用BinaryFormatter在套接字上传输对象。

以下是我BinaryTransport课程的一些测试:

http://fadd.codeplex.com/SourceControl/changeset/view/67972#1055425

实际班级:

http://fadd.codeplex.com/SourceControl/changeset/view/67972#1054822

请注意我不久前写过它们。我刚注意到一些小错误。但要么使用它们,要么只是研究课程以了解更多信息。

答案 2 :(得分:0)

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

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

旁注:哇,这个数据库的想法是我在PC到PC通信方面看到的最疯狂的事情。做得好!

答案 3 :(得分: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。