使用TCP发送和接收多次使用套接字(C#)

时间:2017-05-21 19:03:29

标签: c# sockets tcp

编辑:原来我两次使用同一个端口。虽然像htis这样的线程在过去帮助了我,但是这里会留下这个用谷歌搜索。

我目前正在开发一个项目,我在服务器和客户端上有一个高分列表,两个同步数据,保存在XML中。我已经完成了所有工作,但我一直得到异常" System.Net.Sockets.SocketException:每个套接字地址只有一次使用",我无法弄清楚如何获取摆脱它。对我而言,代码看起来很好,因为我在TcpClient之前关闭了Update,然后再转到Recieve。任何人都可以发现我失踪的东西,或者向我解释我的错误是什么?我对此非常陌生,所以解释中的一些实际代码会有很多帮助!

static void Main(string[] args)
    {
        Update();
        Recieve();

    }

服务器发送到客户端:

public static void Update()
    {
        List<string> stringList = new List<string>();
        XmlDocument highScore = new XmlDocument();
        highScore.Load("hs.xml");
        for (int i = 0; i < 5; i++)
        {
            int placering = i + 1;
            stringList.Add(highScore.SelectSingleNode("highScores/score" + (placering)).InnerText);

        }
        string toSend = stringList[0] + stringList[1] + stringList[2] + stringList[3] + stringList[4];

        string adress = "127.0.0.1";
        int port = 82;
        TcpClient tcpClient = new TcpClient();

        tcpClient.Connect(adress, port);
        NetworkStream stream = tcpClient.GetStream();

        Byte[] bSend = Encoding.ASCII.GetBytes(toSend);
        NetworkStream tcpStream = tcpClient.GetStream();
        tcpStream.Write(bSend, 0, bSend.Length);
        tcpClient.Close();
    }

从客户端收到服务器:

public static void Recieve()
    {
        //skapa ett TcpListener objekt
        IPAddress myIp = IPAddress.Parse("127.0.0.1");
        TcpListener tcpListener;
        int port = 82;


        tcpListener = new TcpListener(myIp, port);
        tcpListener.Start();   //Throws the exception
        Socket socket = tcpListener.AcceptSocket();

        int messageSize;
        Byte[] bMessage = new Byte[256];


        while (true)
        {
            try
            {
                messageSize = socket.Receive(bMessage);
                break;
            }
            catch { }
        }

        //konvertera till string och skriv ut
        string message = "";
        for (int i = 0; i < messageSize; i++)
        {
            message += Convert.ToChar(bMessage[i]);
        }

        for (int i = 0; i < 5; i++)
        {
            SaveScore(int.Parse(message[i].ToString()), i + 1);
        }

        socket.Close();
    }

两种方法在单独的解决方案中都与Program.cs相同。

2 个答案:

答案 0 :(得分:0)

你还应该在Receive方法中停止你的TcpListener,它是否可能从你上次运行的应用程序中打开?

答案 1 :(得分:0)

事实证明这是一个简单的事情,在基本上重写了我发现的方法之后我发现发送和接收的方法都是在我从另一个项目粘贴后使用端口82 ... Yup。感谢那些试图帮助的人,不过大笑