c# ->1 客户端无法连接到 C# 中的服务器

标签 c# .net sockets networking network-programming

我正在用 C# 创建一个聊天客户端,以在本地主机上进行演示。

相关代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Threading;

namespace WindowsFormsApplication1
{
 public partial class Form1 : Form
 {
    static List<TcpListener> garabage_collection_preventor = new List<TcpListener>();
    static Dictionary<IPEndPoint, bool> address_dictionary = new Dictionary<IPEndPoint, bool>();
    static int port_increment = 9999;
    static int client_id = 0;

    void start_listening()
    {
        while (true)
        {
            TcpListener listen = new TcpListener(IPAddress.Any, port_increment);
            garabage_collection_preventor.Add(listen);
            listen.Start();
            TcpClient client = listen.AcceptTcpClient();
            IPEndPoint temp_end = ((IPEndPoint)listen.LocalEndpoint);
            address_dictionary.Add(temp_end, false);
            port_increment++;
            new Thread(new ParameterizedThreadStart(connection_stuff)).Start(client);
        }
    }

    void writer(object ob,int end_point)
    {
        StreamWriter write = ob as StreamWriter;
        while (true)
        {
            foreach (KeyValuePair<IPEndPoint, bool> value in address_dictionary)
            {
                IPEndPoint index = value.Key;
                int temp = value.Key.Port;
                if (temp == end_point)
                {
                    while (address_dictionary[index] == true)
                    {
                        write.WriteLine(msg_box.Text);
                    }
                }
            }
        }
    }

    void reader(StreamReader read)
    {
        while (true)
        {
            MessageBox.Show(read.ReadLine());
        }
    }

    void connection_stuff(object ob)
    {
        TcpClient client = ob as TcpClient;
        int writer_identification_endpoint = ((IPEndPoint)client.Client.LocalEndPoint).Port;

        NetworkStream stream = client.GetStream();
        StreamReader read = new StreamReader(stream);
        StreamWriter write = new StreamWriter(stream);

        ThreadStart port_passing = delegate { writer(write, writer_identification_endpoint); };
        Thread thread = new Thread(port_passing);

        reader(read);
        thread.Start();
    }

    public Form1()
    {
        InitializeComponent();
    }

    private void send_Click(object sender, EventArgs e)
    {
        int end_point = int.Parse(port.Text);
        foreach (KeyValuePair<IPEndPoint, bool> value in address_dictionary)
        {
            IPEndPoint index = value.Key;
            int temp = value.Key.Port;
            if (temp == end_point)
            {
                address_dictionary[index] = true;
            }
        }
    }

    private void listener_Click(object sender, EventArgs e)
    {
        new Thread(start_listening).Start();
        listener.Enabled = false;
    }
 }
}

现在的问题是,第一个客户端可以很容易地连接到该程序并发送该程序可以轻松读取的消息。但是,每个后续客户端都无法连接。

我知道我不应该创建一个 TCPListener,但问题是我必须在本地主机上演示该程序,而端口号是区分客户端的唯一真实方法。

所以请告诉我我已经用头撞墙数小时的代码有什么问题。

编辑

当英语不是第一语言时会发生这种情况:) 此代码(目前不完整)将是一个聊天客户端。此代码的每个实例都将能够与此相同代码的其他实例连接以进行通信。任意数量的实例应该能够与任意数量的实例连接(比如如果双击程序 5 次,现在将有 5 个实例准备好相互通信)。

现在的问题是每个实例都有相同的 IP 地址(因为它们都在同一台机器上运行)。问题出现了,实例 1 假设如何连接到实例 4,此处不能使用 ip,因为实例 2,3 和 5 也将具有相同的 IP 地址。所以我想做的是用 IP 地址和端口连接实例 1 和实例 4,而不是像单个 TCPListener 那样只使用 IP 地址。

最佳答案

尝试将这三行代码移到 start_listening 例程中的 while(true) 循环之外。

TcpListener listen = new TcpListener(IPAddress.Any, port_increment);
garabage_collection_preventor.Add(listen);
listen.Start();

您只需要一个监听器,您可以从中接受许多不同的连接。

关于c# ->1 客户端无法连接到 C# 中的服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13476381/

相关文章:

c# Mysql select value 其中a和b是可除的

c# - C#(ASP.NET)通过套接字与Android通信

C# .Net 4.5 多线程共享变量

c# - WMPLib : player. mediaCollection.getAll().count 始终为 0

.net - 使用安全字符串并保持安全

c# - 计算中的符号(变量 &= 255,整数 = 4 & 19)

c# - 如何阻止方法递归调用自己?

c++ - 从 Boost.ASIO 的套接字类中分离一个本地套接字

java - 为什么这个客户端/服务器程序不停止?

c - 这是在fork上关闭套接字描述符的正确方法吗?