草庐IT

c# - TCP/IP 在不关闭连接的情况下连续接收消息

coder 2023-09-19 原文

我一直在观看以下关于如何创建 TCP/IP 连接的视频:Server Client 我需要做的是创建一个游戏 (flipcard),在其中我只为矩阵发送 2 个坐标。而已。或更少。

(接下来是代码)

据我观察,他每次发送消息时都会关闭并重新打开连接。它的工作。但是,我如何修改代码以保持连接打开并检测消息何时到达

我所有的谷歌搜索都让我找到了这两种方法:

  1. I have had luck using the socket object directly (rather than the TCP client). (但我不想使用套接字)
  2. Also uses sockets

当我点击启动服务器时

        private void bStartServer_Click(object sender, EventArgs e)
    {
        Thread tcpServerRunThread = new Thread(new ThreadStart(TCPServerRun));
        tcpServerRunThread.Start();
    }

服务器运行并等待连接

    private void TCPServerRun()
    {
        TcpListener tcpListener = new TcpListener(IPAddress.Any, 2016);
        tcpListener.Start();
        updateUI("Listening");
        while (true)
        {

            TcpClient client = tcpListener.AcceptTcpClient();
            updateUI("Connected");
            Thread tcpHandlerThread = new Thread(new ParameterizedThreadStart(tcpHandler));
            tcpHandlerThread.Start(client);
        }
    }

我处理我的消息

    private void tcpHandler(object client)
    {
        TcpListener tcpListener = new TcpListener(IPAddress.Any, 5004);
        TcpClient mClient = (TcpClient)client;
        NetworkStream stream =  mClient.GetStream();
        byte[] message = new byte[1024];
        stream.Read(message,0, message.Length);
        updateUI("New message = " + Encoding.ASCII.GetString(message));
        stream.Close();
        mClient.Close();
   } 

注意:updateUI是他做的更新列表框项的函数

客户端 - 几乎像服务器端 `private void button1_Click(object sender, EventArgs e) { 线程 mThread = new Thread(new ThreadStart(ConnectAsClient)); mThread.Start();

    private void ConnectAsClient()
    {
        //                 aici putem inlocui cu adresa de IP dorita             
        //client.Connect(IPAddress.Parse(textBox.Text), 5004);
        client = new TcpClient();
        //client.Connect(IPAddress.Parse("127.0.0.1"), 2016);     // for when I'm not connected to network
        client.Connect(IPAddress.Parse("my_ip_here"), 2016);   // for when I am connected to the network
        updateUI("connected");
        NetworkStream stream = client.GetStream();
        string s = "Hello world!";
        byte[] message = Encoding.ASCII.GetBytes(s);
        stream.Write(message, 0, message.Length);
        this.updateUI("Message sent!");
       stream.Close();
       // client.Close();
    }`

如果我没记错的话,每次他再次连接时,他都会创建一个新连接,而不是打开旧连接,对吗? (我是第一次使用TCP/IP,自学,所以如果可能我宁愿不使用套接字)

-------------------------------------------- --------------------------

我的代码的完整链接(根据开头提供的视频稍作修改):

  1. TCPClient
  2. TCPServer

最佳答案

您每次发送消息时都会重新连接。为此使用两种不同的方法;一个用于连接到服务器,然后另一个用于实际发送消息。像这样:

TcpClient client;
private void ConnectAsClient()
{           
    //client.Connect(IPAddress.Parse(textBox.Text), 5004);
    client = new TcpClient();
    //client.Connect(IPAddress.Parse("127.0.0.1"), 2016);
    client.Connect(IPAddress.Parse("my_ip_here"), 2016);
    updateUI("connected");
}
void SendMessage()
{
    NetworkStream stream = client.GetStream();
    string s = "Hello world!";
    byte[] message = Encoding.ASCII.GetBytes(s);
    stream.Write(message, 0, message.Length);
    this.updateUI("Message sent!");
}

关于c# - TCP/IP 在不关闭连接的情况下连续接收消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41558538/

有关c# - TCP/IP 在不关闭连接的情况下连续接收消息的更多相关文章

  1. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  2. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  5. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  9. ruby - 如何关闭 ruby​​ gem "Spreadsheet?"中的文件 - 2

    下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐