2015-06-02 2 views
0

Я пытаюсь подключиться к моему серверу C# с моего сайта с помощью PHP.Соединение с сервером PHP с сервером Socket Socket

Я хотел бы поддерживать связь через все страницы.

C# Сервер: Порт 100

using System; 
using System.Collections.Generic; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 

namespace Multi_Server 
{ 
    class Program 
    { 
     private static Socket _serverSocket; 
     private static readonly List<Socket> _clientSockets = new List<Socket>(); 
     private const int _BUFFER_SIZE = 2048; 
     private const int _PORT = 100; 
     private static readonly byte[] _buffer = new byte[_BUFFER_SIZE]; 

     static void Main() 
     { 
      Console.Title = "Server"; 
      SetupServer(); 
      Console.ReadLine(); // When we press enter close everything 
      CloseAllSockets(); 
     } 

     private static void SetupServer() 
     { 
      Console.WriteLine("Setting up server..."); 
      _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      _serverSocket.Bind(new IPEndPoint(IPAddress.Any, _PORT)); 
      _serverSocket.Listen(5); 
      _serverSocket.BeginAccept(AcceptCallback, null); 
      Console.WriteLine("Server setup complete"); 
     } 

     /// <summary> 
     /// Close all connected client (we do not need to shutdown the server socket as its connections 
     /// are already closed with the clients) 
     /// </summary> 
     private static void CloseAllSockets() 
     { 
      foreach (Socket socket in _clientSockets) 
      { 
       socket.Shutdown(SocketShutdown.Both); 
       socket.Close(); 
      } 

      _serverSocket.Close(); 
     } 

     private static void AcceptCallback(IAsyncResult AR) 
     { 
      Socket socket; 

      try 
      { 
       socket = _serverSocket.EndAccept(AR); 
      } 
      catch (ObjectDisposedException) // I cannot seem to avoid this (on exit when properly closing sockets) 
      { 
       return; 
      } 

      _clientSockets.Add(socket); 
      socket.BeginReceive(_buffer, 0, _BUFFER_SIZE, SocketFlags.None, ReceiveCallback, socket); 
      Console.WriteLine("Client connected, waiting for request..."); 
      _serverSocket.BeginAccept(AcceptCallback, null); 
     } 

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

      try 
      { 
       received = current.EndReceive(AR); 
      } 
      catch (SocketException) 
      { 
       Console.WriteLine("Client forcefully disconnected"); 
       current.Close(); // Dont shutdown because the socket may be disposed and its disconnected anyway 
       _clientSockets.Remove(current); 
       return; 
      } 

      byte[] recBuf = new byte[received]; 
      Array.Copy(_buffer, recBuf, received); 
      string text = Encoding.ASCII.GetString(recBuf); 
      Console.WriteLine("Received Text: " + text); 

      if (text.ToLower() == "get time") // Client requested time 
      { 
       Console.WriteLine("Text is a get time request"); 
       byte[] data = Encoding.ASCII.GetBytes(DateTime.Now.ToLongTimeString()); 
       current.Send(data); 
       Console.WriteLine("Time sent to client"); 
      } 
      else if (text.ToLower() == "exit") // Client wants to exit gracefully 
      { 
       // Always Shutdown before closing 
       current.Shutdown(SocketShutdown.Both); 
       current.Close(); 
       _clientSockets.Remove(current); 
       Console.WriteLine("Client disconnected"); 
       return; 
      } 
      else 
      { 
       Console.WriteLine("Text is an invalid request"); 
       byte[] data = Encoding.ASCII.GetBytes("Invalid request"); 
       current.Send(data); 
       Console.WriteLine("Warning Sent"); 
      } 

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

Я использую http://php.net/manual/en/book.sockets.php

Пожалуйста, не предлагают альтернативы (это запасной вариант для не совместимых браузеров HTML5)

PHP:

<?PHP 
$service_port = 100; 
    $address = '10.10.10.12'; 

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
    socket_set_nonblock($socket); 

socket_connect($socket, $address, $service_port); 

?> 

Мой php-код вызывает ошибку на моем сервере wh подключен. https://www.anony.ws/i/2015/06/02/Capture1aa49.png

У меня та же проблема при попытке подключиться через питон ..

#!/Python34/python 
import socket 
HOST = '10.10.10.12' # The remote host 
PORT = 100    # The same port as used by the server 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((HOST, PORT)) 
s.sendall('Hello, world') 
data = s.recv(1024) 
s.close() 
print('Received', repr(data)) 

Я был в состоянии отследить ошибку ... Еще не уверен, что является причиной его .. сообщение : Произошла ошибка сокета TCPIP (10053): установленное соединение было прервано программным обеспечением вашего хост-компьютера. Причина: сервер закрыл клиентское соединение. Действие: Обратитесь к администратору сети или администратору сервера.

Произошла ошибка, которая выиграла Начало получения для сервера, что заставляет сервер закрыть соединение. Я считаю, что я неправильно отправляю информацию на сервер, если я вынимаю получение для сервера, соединение не прерывается.

+0

Можете ли вы добавить обработку ошибок на стороне PHP? [На этой странице объясняется, как] (http://php.net/manual/en/function.socket-connect.php), а затем размещать ошибки, чтобы мы могли понять, почему PHP жалуется. –

+0

Я хотел бы поддерживать связь на всех страницах. ... Невозможно. Трассировка стека показывает, что данные, отправляемые PHP, не являются ASCII-форматированными ... скорее всего, UTF8. В этом случае вам нужно использовать другой декодер для синтаксического анализа ответа. – geggleto

+0

Неблокируемая операция сокета не может быть выполнена немедленно. @ N.B. – user3236428

ответ

0

сохранение связи с использованием PHP не является хорошей практикой и приведет к тому, что страница не завершит загрузку. PHP должен быть закрыт к моменту, когда веб-браузер получит свой вывод. рассмотрите возможность использования Javascript, а не PHP. Причина, по которой вы закрываете соединение, - это рукопожатие.