2016-08-23 70 views
0

我需要创建一个应用程序以将所有连接到套接字服务器的客户的时间返回给我。 但我的应用程序只能在本地进行通信。C#套接字服务器只在本地进行通信

例子:

如果端点服务器是:(192.168.0.1,32000)
客户终端是:(192.168.0.1,32000)
它们连接和comunnicate。

如果端点服务器是:(192.168.0.1,32000)
客户终端是:(192.168.0.2,32000)
它们连接,但不comunnicate。

服务器代码:

class Server:Sincronia 
{ 
    GetIP getip = new GetIP(); 

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

    private List<Socket> ListaDeClientesSockets = new List<Socket>(); /*Lista de sockets para adicionar clientes*/ 

    private List<string> ListaDeClients = new List<string>(); 

    private List<string> ListaDeHoras = new List<string>(); 

    private const int _BUFFER_SIZE = 2048; 
    private int _PORT; 
    private string Ip; 
    private byte[] _buffer = new byte[_BUFFER_SIZE]; 

    public Server(string IP, int port) /*Construtor para inicialização do IP e da Porta*/ 
    { 
     this.Ip = IP; 
     this._PORT = port; 
    } 

    public void Connect() 
    { 
     Console.WriteLine("Socket Server ON"); 
     Console.WriteLine(getip.getIP()); 
     _serverSocket.Bind(new IPEndPoint(IPAddress.Parse(getip.getIP()), _PORT)); 
     _serverSocket.Listen(5); 
     _serverSocket.BeginAccept(AcceptCallback, null); 
    } 


    public void ShowAllClients() 
    { 
     Console.WriteLine("####################### " + ListaDeClientesSockets.Count + " #######################"); 


     for (int i = 0; i < ListaDeClientesSockets.Count; i++) 
     { 
      int j = i + 1; 
      Console.WriteLine("Client : " + j + " IP : " + ListaDeClients[i]); 
     } 
    } 

    private void CloseConnections() 
    { 

     foreach (Socket socket in ListaDeClientesSockets) 
     { 
      socket.Shutdown(SocketShutdown.Both); 
      socket.Close(); 
     } 

     _serverSocket.Close(); 
    } 

    /// <summary>AcceptCallback método da classe Server 
    /// Evento realizado para aceitar conexões dos clientes adicionando em uma lista genérica 
    /// /// </summary> 

    private void AcceptCallback(IAsyncResult asyncronousResult) 
    { 
     Socket socket; 

     try 
     { 
      socket = _serverSocket.EndAccept(asyncronousResult); 
     } 
     catch (ObjectDisposedException) 
     { 
      return; 
     } 

     ListaDeClientesSockets.Add(socket); 
     ListaDeClients.Add(((IPEndPoint)socket.RemoteEndPoint).Address.ToString()); 
     socket.BeginReceive(_buffer, 0, _BUFFER_SIZE, SocketFlags.None, ReceiveCallback, socket); 
     Console.WriteLine("Client Connect " + ((IPEndPoint)socket.RemoteEndPoint).Address.ToString()); 
     _serverSocket.BeginAccept(AcceptCallback, null); 
    } 


    public void SendToALL(string text) 
    { 
     foreach(Socket socket in ListaDeClientesSockets.ToList()) 
     { 
      ListaDeHoras.Clear(); 
      byte[] dataByte = Encoding.ASCII.GetBytes(text); 

      socket.Send(dataByte); 

     } 
    } 
    /// <summary>ReceiveCallBack método da classe Server 
    /// Evento realizado para receber e enviar dados do cliente através de um IASyncResult 
    /// </summary> 

    private void ReceiveCallback(IAsyncResult asyncronousResult) 
    { 
     Socket current = (Socket)asyncronousResult.AsyncState; 
     int received; 

     try 
     { 
      received = current.EndReceive(asyncronousResult); 
     } 
     catch (SocketException) /*Catch realizado caso houver perca de conexão com o cliente*/ 
     { 
      Console.WriteLine("Conexão com o cliente " + ((IPEndPoint) current.RemoteEndPoint).Address.ToString() + " perdida."); 
      current.Close(); 
      ListaDeClients.Remove(((IPEndPoint)current.RemoteEndPoint).Address.ToString()); 
      ListaDeClientesSockets.Remove(current); 
      return; 
     } 

     byte[] recBuf = new byte[received]; 
     Array.Copy(_buffer, recBuf, received); 
     string text = Encoding.ASCII.GetString(recBuf); 

     Console.WriteLine("Received Text: " + text); 
     ListaDeHoras.Add(text); 


     current.BeginReceive(_buffer, 0, _BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current); 

    } 
} 

程序服务器代码:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.Title = "Servidor"; 

     Server server = new Server("localhost", 8000); 

     server.Connect(); 
     while (true) 
     { 
      string text = Console.ReadLine(); 

      if (text == "mostrar") 
       server.ShowAllClients(); 
      else 
       server.SendToALL(text); 
     } 

     Console.ReadKey(); 
    } 
} 

客户端代码:

class Client 
{ 
    Socket socketClient; 

    static int port = 8000; 
    static string localhostIP = "127.0.0.1"; 

    private const int _BUFFER_SIZE = 2048; 
    private byte[] _buffer = new byte[_BUFFER_SIZE]; 

    private string IP; 

    public Client(string ip) 
    { 
     this.IP = ip; 
    } 

    public void Start() 
    { 
     IPEndPoint endp = new IPEndPoint(IPAddress.Parse(IP), port); 
     try 
     { 
      socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      socketClient.BeginConnect(endp, new AsyncCallback(ConnectCALLBACK), socketClient); 
      Receive(socketClient); 
     } 
     catch 
     { 

     } 
    } 

    private void ConnectCALLBACK(IAsyncResult assynresult) 
    { 
     try 
     { 
      Socket client = (Socket)assynresult.AsyncState; 
      Console.WriteLine("Conectado"); 
      client.EndConnect(assynresult); 
     } 
     catch(SocketException) 
     { 
      Console.WriteLine("Falta de conexão com o servidor, verifique sua conexão."); 
     } 

    } 

    public void Receive(Socket socket) 
    { 
     try 
     { 
      socket.BeginReceive(_buffer, 0, _BUFFER_SIZE, SocketFlags.None, ReceiveCallback, socket); 
     } 
     catch 
     { 

     } 
    } 

    private void ReceiveCallback(IAsyncResult asyncronousResult) 
    { 
     Socket current = (Socket)asyncronousResult.AsyncState; 
     int received; 

     try 
     { 
      received = current.EndReceive(asyncronousResult); 
     } 
     catch (SocketException) 
     { 
      return; 
     } 

     byte[] recBuf = new byte[received]; 
     Array.Copy(_buffer, recBuf, received); 
     string text = Encoding.ASCII.GetString(recBuf); 

     if(text == "clock") 
     { 
      string horas = DateTime.Now.ToString("dd-MM-yyyy HH:mm"); 
      byte[] sended = Encoding.ASCII.GetBytes(horas); 
      current.Send(sended); 
     } 


     current.BeginReceive(_buffer, 0, _BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current); 
    } 
} 

我所需要的服务器类型 “时钟”,这被发送到所有客户端。

而且客户端收到客户端发送给他们的时间。

+1

取代你的客户端启动功能,你有没有测试了服务器的端口是否是防火墙或只需打开人人网看起来就像你正在使用你的沟通是后面的端口一个防火墙 –

+0

Ja被释放了门,但它没有工作。 –

+1

假设您已正确配置服务器和客户端的IP地址,则会出现网络配置问题。如果你还没有,你的代码中会出现印刷错误。无论哪种方式,这个问题都是无关紧要的。如果你相信这是两种可能性之一以外的东西,请解决你的问题,使其包含一个可靠地再现问题的良好[mcve]。 –

回答

0

只是下面

public void Start() 
    { 
     IPEndPoint endp = new IPEndPoint(IPAddress.Parse(IP), port); 
     try 
     { 
      socketClient = new Socket(endp, SocketType.Stream, ProtocolType.Tcp); 
      socketClient.BeginConnect(endp, new AsyncCallback(ConnectCALLBACK), socketClient); 
      Receive(socketClient); 
     } 
     catch 
     { 

     } 
    } 
+0

在socketClient =新的套接字(结束,...)endp无法从“System.Net.IPEndpoint”转换为“System.Sockets .AddressFamily” –