【问题标题】:Socket Programming C# Chat ServiceSocket 编程 C# 聊天服务
【发布时间】:2017-03-12 21:34:03
【问题描述】:

我知道这可能是一个过于笼统的问题,但是 C# 中的套接字编程背后的概念是什么?我可以使用以下代码自己发送/接收数据:

//client side?
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace client1 
{
    class Program
    {

        private static Socket _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        static void Main(string[] args)
        {
            Console.Title = "Client";
            LoopConnect();
            SendLoop();
        }

        private static void SendLoop()
        {
            while (true)
            {
                Console.Write("Enter a request: ");
                string req = Console.ReadLine();
                byte[] buffer = Encoding.ASCII.GetBytes(req);
                _clientSocket.Send(buffer);

                byte[] receivedBuf = new byte[1024];
                int rec = _clientSocket.Receive(receivedBuf);
                byte[] data = new byte[rec];
                Array.Copy(receivedBuf, data, rec);
                Console.WriteLine("Received: " + Encoding.ASCII.GetString(data));
            }
        }

        private static void LoopConnect()
        {

            int attempts = 0;

            while (!_clientSocket.Connected)
            {
                try
                {
                    attempts++;

                    _clientSocket.Connect(IPAddress.Loopback, 100);
                }
                catch (SocketException)
                {
                    Console.Clear();
                    Console.WriteLine("Connection attempts: " + attempts.ToString());
                }
            }

            Console.Clear();
            Console.WriteLine("Connected");
        }
    }
}


//server side?
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;

namespace server1
{
    class Program
    {
        private static List<Socket> _clientSockets = new List<Socket>();
        private static Socket _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        private static byte[] _buffer = new byte[1024];

        static void Main(string[] args)
        {
            Console.Title = "Server";
            SetupServer();
            Console.ReadLine();
        }

        private static void SetupServer()
        {
            Console.WriteLine("Setting up server...");
            _serverSocket.Bind(new IPEndPoint(IPAddress.Any, 100));
            _serverSocket.Listen(5);
            _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
        }

        private static void AcceptCallback(IAsyncResult AR)
        {
            Socket socket = _serverSocket.EndAccept(AR);
            _clientSockets.Add(socket);
            Console.WriteLine("Client connected...");
            socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket);
            _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
        }

        private static void ReceiveCallback(IAsyncResult AR)
        {
            Socket socket = (Socket)AR.AsyncState;
            int received = socket.EndReceive(AR);

            byte[] dataBuf = new byte[received];
            Array.Copy(_buffer, dataBuf, received);

            string text = Encoding.ASCII.GetString(dataBuf);
            Console.WriteLine("Text received: " + text);

            string response = string.Empty;

            if (text.ToLower() != "get time")
            {
                response = "Invalid Request";
            } else
            {
                response = DateTime.Now.ToLongDateString();
            }

            //if (text.ToLower() == "get time")
            //{
                //SendText(DateTime.Now.ToLongTimeString());
                //byte[] data = Encoding.ASCII.GetBytes(DateTime.Now.ToLongTimeString());
                //socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket);
            //}

            byte[] data = Encoding.ASCII.GetBytes(DateTime.Now.ToLongTimeString());
            socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket);
            socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket);
        }

        private static void SendCallback(IAsyncResult AR)
        {
            Socket socket = (Socket)AR.AsyncState;
            socket.EndSend(AR);
        }
    }
}

但是,当我在运行 server.exe 时将 client.exe 提供给在同一网络上的朋友时,他无法连接到我。有人对我做错了什么有任何建议吗?

【问题讨论】:

  • 指定端口阻塞请求的防火墙规则。
  • 不太可能与您的问题有关,但您需要了解message framing 仅仅因为您做了一次发送并不意味着您一定有一次接收。可以合并多个发送,也可以拆分单个发送。
  • 当你说同一个网络时,你仍然需要通过 IP 连接到他,检查你的机器内部 ip。我猜你分享的是同一个外部的
  • @eranotzap 我们具有相同的连接特定 DNS 后缀、子网掩码和默认网关,但链路本地 IPv6 地址和 IPv4 地址不同。
  • 你换过IPAddress.Loopback吗?

标签: c# .net sockets visual-studio-2015


【解决方案1】:

根据您问题中的当前代码,客户端尝试连接到环回 (127.0.0.1),因此如果服务器安装在不同的上,它不起作用 机器。

如果这是一个拼写错误并且您已正确配置 IP 地址,请仔细检查是否没有防火墙阻止请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-22
    • 2021-12-04
    • 1970-01-01
    • 2019-05-09
    • 2013-10-21
    • 2014-04-18
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多