c# - C# 中的 Winsock 服务器/客户端应用程序

标签 c# client-server winsock

我正在使用winsock Control 用C# 制作一个客户端/服务器应用程序。我做了其中的所有事情,但我卡住了从客户端向服务器发送数据的位置。在我的程序中,服务器始终使用 IP 和端口监听客户端。我将数据从客户端发送到服务器。

1)当点击服务器上的Listen按钮时,它会打开客户端连接的服务器。

2)在第一个客户端表单中,我单击连接按钮,服务器已连接,给出一条消息(连接事件:ip),通过此消息,我们很容易知道客户端已连接到服务器。

3)然后我们在“发送数据”文本框中输入一些数据,然后单击“发送”按钮将数据发送到服务器并保存在客户端。

代码如下:

服务器:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.Net.Sockets;

namespace Server
{
    public partial class Form1 : Form
    {      
        public Form1()
        {
            InitializeComponent();        
        }
        const string DEFAULT_SERVER = "ip";
        const int DEFAULT_PORT = 120;

        System.Net.Sockets.Socket serverSocket;
        System.Net.Sockets.SocketInformation serverSocketInfo;

        public string Startup()
        {               
            IPHostEntry hostInfo = Dns.GetHostByName(DEFAULT_SERVER);
            IPAddress serverAddr = hostInfo.AddressList[0];
            var serverEndPoint = new IPEndPoint(serverAddr, DEFAULT_PORT);            
            serverSocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
            serverSocket.Bind(serverEndPoint);

            return serverSocket.LocalEndPoint.ToString();    
        }

        public string Listen()
        {
            int backlog = 0;
            try
            {
                serverSocket.Listen(backlog);
                return "Server listening";
            }
            catch (Exception ex)
            {
                return "Failed to listen" + ex.ToString();
            }
        }
        public string ReceiveData()
        {
            System.Net.Sockets.Socket receiveSocket;

            byte[] buffer = new byte[256];

            receiveSocket = serverSocket.Accept();

            var bytesrecd = receiveSocket.Receive(buffer);

            receiveSocket.Close();

            System.Text.Encoding encoding = System.Text.Encoding.UTF8;

            return encoding.GetString(buffer);
        }           

        private void Listen_Click(object sender, EventArgs e)
        {
            string serverInfo = Startup();
            textBox1.Text = "Server started at:" + serverInfo;

            serverInfo = Listen();
            textBox1.Text = serverInfo;

            //string datatosend = Console.ReadLine();
            //SendData(datatosend);

            serverInfo = ReceiveData();
            textBox1.Text = serverInfo;

            //Console.ReadLine();
        }

        private void winsock_DataArrival(object sender, AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent e)
        {
            ReceiveData();
            Listen();
        }

        private void winsock_ConnectEvent(object sender, EventArgs e)
        {
            Listen();
        }
    }
}

这一切都工作得很好,但我的问题是我只能一次从客户端获取数据到服务器。当我再次从客户端向服务器发送数据时,它不起作用并给我一些消息,例如

Additional information: Only one usage of each socket address (protocol/network address/port) is normally permitted

以服务器形式

serverSocket.Bind(serverEndPoint);

请有人帮助我解决我的问题。

谢谢。

最佳答案

试试这个。对你有帮助

delegate void AddTextCallback(string text);

public Form1()
{
    InitializeComponent();
}
private void ButtonConnected_Click(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(ServerHandler));
}

private void ServerHandler(object state)
{
    TcpListener _listner = new TcpListener(IPAddress.Parse("12.2.54.658"), 145);

    _listner.Start();

    AddText("Server started - Listening on port 145");

    Socket _sock = _listner.AcceptSocket();

    //AddText("User from IP " + _sock.RemoteEndPoint);

    while (_sock.Connected)
    {
        byte[] _Buffer = new byte[1024];

        int _DataReceived = _sock.Receive(_Buffer);

        if (_DataReceived == 0)
        {
            break;
        }

        AddText("Message Received...");

        string _Message = Encoding.ASCII.GetString(_Buffer);

        AddText(_Message);
    }

    _sock.Close();
    AddText("Client Disconnected.");

    _listner.Stop();
    AddText("Server Stop.");
}

private void AddText(string text)
{
    if (this.listBox1.InvokeRequired)
    {
        AddTextCallback d = new AddTextCallback(AddText);
        this.Invoke(d, new object[] { text });
    }
    else
    {
        this.listBox1.Items.Add(text);
    }
}

上个月我也遇到了和你一样的问题,但我用这个 Receive multiple different messages TcpListener C# 解决了这个问题来自堆栈溢出。这对我很有帮助,希望它也能帮助解决您的问题。

关于c# - C# 中的 Winsock 服务器/客户端应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37226176/

相关文章:

Java Client/Server读写不工作且无错误

java - 检查您要连接的端口是否正在使用

c++ - 未连接的 UDP 套接字上的 WSARecvFrom 不返回

c# - 如何在我的 ASP.NET ListView 中创建 If 子句?

c# - 使用 iTextSharp 将页面添加到 PDF 文档

c# - 我们应该使用结构来表示数据,使用类来表示行为吗?

close() 没有正确关闭套接字

c++ - Multipe Send( )'s and Recv()' s 使用 Winsock2

c++ - 寻找用于 windows、c 或 c++ 的 TCP 套接字编程的最简单(也是最快)示例

c# - 如何在 ASP MVC 的局部 View 中实现选项卡