package server_TCP;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Server_TCP {
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////// поток 0 main:
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////поток 5 TCP Сервер:
static int TX_st1;// RX_st счётчик пакетов
static byte[] RX_byte_7 = new byte[1500]; // Ethernet // 10000 буфер поток = 8192 byte 			    
static int x_7 = 0;    // счёт 
static int len_7 = 0;			    
static int cikl_7 = 0; //цикл 5c
static String s_7 = "";  
static String s_7_TX = "";  
static String s_7_RX = "";
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////поток 6 TCP Клиент:
static int flag_TCP_Клиент = 0;     
static byte[] RX_byte_8 = new byte[1500]; // Ethernet // 10000 буфер поток = 8192 		    
static int x_8 = 0;     // счёт
static int len_8 = 0;			    
static int cikl_8 = 0;
static String s_8_TX = "";  
static String s_8_RX = "";
static int flag_error_8 = 0;
static String IP_LAN_WAN_8 = "";         // LAN_WAN
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////// поток 0 Клиент: 
public static void main(String[] args) throws Exception
{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////// окно_Консоль:	
		final JFrame frame = new JFrame(
		"Консоль ");  
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(900, 100, 1000, 545); // x,y,размер,размер 
		frame.setLayout(null);
		frame.setResizable(false);
		/////////////////////////////////////////////////////////// TextArea "TX"  
		final JTextArea ta = new JTextArea("TX");    //"текст", 10, 20  
		Color RGB_Fon = new Color(253, 245, 230);    // RGB фон     
		ta.setBackground(RGB_Fon);                   // RGB фон 
	    Color RGB_Text = new Color(25, 25, 112);     // RGB Text
	    ta.setForeground(RGB_Text);                  // RGB Text  
	 	ta.setFont(new Font("Dialog", Font.PLAIN, 14));
	 	/////////////////////////////////////////////// ScrollPane
	    JScrollPane sp  =  new  JScrollPane (ta);
	    sp.setBounds(5, 5, 982, 200);                // x,y,размер,размер
	    frame.add(sp);                               // добавить 
	    /////////////////////////////////////////////////////////// TextArea1 "RX"  
		final JTextArea ta1 = new JTextArea("RX");   //"текст", 10, 20 
		Color RGB_Fon_1 = new Color(253, 245, 230);  // RGB фон     
		ta1.setBackground(RGB_Fon_1);                // RGB фон 
		Color RGB_Text_1 = new Color(25, 25, 112);   // RGB Text
	    ta1.setForeground(RGB_Text_1);               // RGB Text  
		ta1.setFont(new Font("Dialog", Font.PLAIN, 14));
	    /////////////////////////////////////////////// ScrollPane
		JScrollPane sp1  =  new  JScrollPane (ta1);
	    sp1.setBounds(5, 208, 982, 200);             // x,y,размер,размер
	    frame.add(sp1);                              // добавить 
////////////////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////// Button "TCP_Клиент"
 	   	JButton Button_TCP_Клиент = new JButton("TCP_Клиент");   
 	    Button_TCP_Клиент.setBounds(750, 455, 120, 24);               // x,y,размер,размер  
 	    Button_TCP_Клиент.setFont(new Font("Dialog", Font.PLAIN, 14));// шрифт
        frame.add(Button_TCP_Клиент);                                 // добавить 
        Button_TCP_Клиент.addActionListener(new ActionListener() {    // Слушатель Button   
		public void actionPerformed(ActionEvent event) {
			/////////////////////////////////////////////////////// 
			flag_TCP_Клиент = 1; 
		}});
        
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////// окно_Консоль:
		frame.setVisible(true);     // true/false // включить окно_Консоль           
////////////////////////////////////////////////////////////////////////////////

	   
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////// поток 5 TCP Сервер:
  Thread Thready_5 = new Thread(new Runnable()
  {
    public void run() // поток 5
    {
       ///////////////////////////////////////////////////////////// сервер-сокет:
       while(true)
       {
        s_7_RX = "----------------------------------------------------" + "\n"; 
        ServerSocket server_7 = null;
        // слушаем порт 80 
        try 
        {
          server_7 = new ServerSocket(80); // 
        } catch (IOException e) {
          s_7_RX += "Сервер: Ошибка Сервер-сокет" + "\n";
        } 
        // создаём сокет для общения с клиентом
        Socket socket_7 = null;
        try 
        {
          //accept() Ожидание подключения клиента
          socket_7 = server_7.accept();
          s_7_RX += "Сервер: (SYN)" + "\n";
        } catch (IOException e) {
          s_7_RX += "Сервер: Ошибка сокет" + "\n";
        } 
        // создаём поток ввода/вывода 
        InputStream in_7 = null;
        OutputStream out_7 = null;
        try 
        {
          in_7 = socket_7.getInputStream();
          out_7 = socket_7.getOutputStream();
        } catch (IOException e) {
          s_7_RX += "Сервер: Ошибка потока ввода/вывода" + "\n";
        }
        /////////////////////////////////////////////////////////////////////////// IP_2 > LCD:
        //Inet_IP, Inet_порт
        s_7_RX += "Сервер: " + socket_7.getInetAddress() + ":" + socket_7.getPort();
        //Local_IP, Local_порт
        s_7_RX += " >> " + socket_7.getLocalAddress() + ":" + socket_7.getLocalPort() + "\n";
        /////////////////////////////////////////////////////////////////////////// RX_2: цикл 5с
        cikl_7 = 0;        // сброс цикл 5с
        while(cikl_7 < 500)// цикл 5с
        {
          // останавливает поток на ms.
          try {Thread.sleep(10);} // CPU !
          catch (InterruptedException e3) {} 
          //проверка приёмного буфера
          len_7 = 0; // сброс len
          try 
          {
            //available() получение количество доступных для чтения байтов потока InputStream
            len_7 = in_7.available();
          } catch (IOException e3) {
            s_7_RX += "Сервер: Ошибка available" + "\n";
          }
          // читаем приёмный буфер 
          if (len_7>0){    
            if (len_7>1500){len_7=1500;}; // Ethernet
              s_7_RX += "Сервер: RX байт = " + len_7 + "\n";
              cikl_7=500; // сброс цикл 5с
              // читаем поток InputStream
              for (x_7 = 0; x_7<len_7; x_7++){ 
                try 
                {
                  RX_byte_7[x_7] = (byte) in_7.read(); 
                } catch (IOException e) {
                  s_7_RX += "Сервер: Ошибка read" + "\n";
                }
              };  
            };
            //////////////////////////////////////////////////////////////// цикл 5с
            cikl_7++; // счёт цикл 5с
           }
           /////////////////////////////////////////////////// приёмный буфер len_7:         
           if (len_7>0){ 
             /////////////////////////////////////////////////////////////// RX > LCD:
             s_7_RX += new String(RX_byte_7, 0, len_7) + "\n";  // HEX > String 
             
             //////////////////////////////////////////////////////////// система: RX

             //////////////////////////////////////////////////////////// система: TX
             s_7 = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; // 
             s_7 += socket_7.getInetAddress() + ":" + socket_7.getPort() + "\n";// Inet_IP, Inet_порт
             s_7 += "/" + TX_st1;// RX_st счётчик пакетов
             //////////////////////////////////////////////////////////// TX: 
             //////////////////////// Text_TX > буфер
             byte[] b_TX_2 = s_7.getBytes();
             s_7_RX += "Сервер: TX байт = " + b_TX_2.length + "\n";
             //////////////////////// Text_TX > LCD
             s_7_RX += s_7 + "\n";
             //////////////////////// Text_TX > TX
             try 
             {
               out_7.write(b_TX_2);
             } catch (IOException e) {
               s_7_RX += "Сервер: Ошибка TX (RST)" + "\n";
             }
            ///////////////////////////////////////////////////////////// len_7>0
            }
           ////////////////////////////////////////////////////////////// RX таймаут:
           else{
            s_7_RX += "Сервер: RX таймаут 5с" + "\n";
           };
           ////////////////////////////////////////////////////////////// socket.close (FIN)			
           try 
           {
             server_7.close();
             socket_7.close();
           } catch (IOException e1) {
             s_7_RX += "Сервер: Ошибка close" + "\n";
           }
           s_7_RX += "Сервер: (FIN)" + "\n";
           s_7_RX += "----------------------------------------------------" + "\n"; 
           ////////////////////////////////////////////////////////////// LCD:
           ta1.setText(s_7_RX);                // > TextArea 
           ////////////////////////////////////////////////////////////// 
        }  			
      }   
  });  
  Thready_5.start();	// start поток 5
////////////////////////////////////////////////////////////////////////////////

   
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////// поток 6 TCP Клиент:
  Thread Thready_6 = new Thread(new Runnable()
  {
    public void run() // поток 6
    {
      //////////////////////////////////////////////////////////////  
      while(true)
      {
         /////////////////////////////////////////////////////////// 
	     /**/
	     // ждём flag_TCP_Клиент...
	     while(flag_TCP_Клиент == 0) {
	       // останавливает поток на ms.
	       try {Thread.sleep(1000);} // CPU !
	       catch (InterruptedException e8) {} 
	     }; 
    	 /////////////////////////////////////////////////////////// сокет:
    	 flag_error_8 = 0; // сброс flag_error_3
    	 s_8_RX = "----------------------------------------------------" + "\n";  
    	 /////////////////////////////////////////////////////////// TX: IP_LAN_WAN:
    	 //"192.168.0.101";//> SYN  //"ya.ru";//> DNS 
    	 IP_LAN_WAN_8 = "192.168.0.101";  // LAN  
    	 /////////////////////////////////////////////////////////// TX: порт:
    	 int port_8 = 80;  
    	 // Создаем сокет 
    	 s_8_RX += "Клиент: (SYN)" + " Host: " + IP_LAN_WAN_8 + ", port: " + port_8 + "\n";//15c
    	 Socket socket_8 = null;
    	 try {
    	   socket_8 = new Socket(IP_LAN_WAN_8, port_8);//IP_8
    	 } catch (UnknownHostException e) {
    	   flag_error_8 = 1;
    	   s_8_RX += "Клиент: Ошибка (DNS) (Неизвестный Host)" + "\n";
    	 } catch (IOException e) {
    	   flag_error_8 = 1;
    	   s_8_RX += "Клиент: Ошибка (SYN) (Host не отвечает)" + "\n";
    	 }
    	 if (flag_error_8 == 0){ // 1 -ошибка сокет			   
    	 /////////////////////////////////////////////////////////// поток: 
    	 // создаём поток ввода/вывода 
    	 InputStream in_8 = null;
    	 OutputStream out_8 = null;
    	 try {
    	   in_8 = socket_8.getInputStream();
    	   out_8 = socket_8.getOutputStream();
    	 } catch (IOException e) {
    	   s_8_RX += "Клиент: Ошибка потока" + "\n";
    	 }
    	 ////////////////////////////////////////////////////////// IP, порт:
    	 // Local_IP, Local_порт
    	 s_8_RX += "Клиент: " + socket_8.getLocalAddress() + ":" + socket_8.getLocalPort();	
    	 // Inet_IP, Inet_порт 
    	 s_8_RX += " >> " + socket_8.getInetAddress() + ":" + socket_8.getPort() + "\n";			   
    	 ////////////////////////////////////////////////////////// система: TX 
    	 s_8_TX = "GET /"; //
    	 s_8_TX += " HTTP/1.1\r\n"; //
    	 ////////////////////////////////////////////////////////// TX TCP:
    	 //////////////////////// Text_TX > буфер
    	 byte[] b_TX_8 = s_8_TX.getBytes();
    	 s_8_RX += "Клиент: TX байт = " + b_TX_8.length + "\n";
    	 //////////////////////// Text_TX > LCD
    	 s_8_RX += s_8_TX + "\n";
    	 //////////////////////// Text_TX > TX
    	 try {
    	   out_8.write(b_TX_8);
    	 } catch (IOException e) {
    	   s_8_RX += "Ошибка TX" + "\n";
    	 }
    	 ////////////////////////////////////////////////////////// RX TCP: цикл 5с
    	 cikl_8 = 0;        // сброс цикл 5с
    	 while(cikl_8 < 500)// цикл 5с
    	 {
    	 // останавливает поток на ms.
    	 try {Thread.sleep(10);} // CPU !
    	 catch (InterruptedException e3) {} 
    	 //проверка приёмного буфера
    	 len_8 = 0; // сброс len
    	 try {
    	 //available() получение количество доступных для чтения байтов потока InputStream
    	 len_8 = in_8.available();
    	 } catch (IOException e8) {
    	 s_8_RX += "Ошибка available" + "\n";
    	 }
    	 // читаем приёмный буфер 
    	 if (len_8>0){    
    	 if (len_8>1500){len_8=1500;}; // Ethernet
    	  s_8_RX += "Клиент: RX байт = " + len_8 + "\n";// RX байт > LCD
    	  cikl_8=500; // сброс цикл 5с
    	  // читаем поток InputStream
    	  for (x_8 = 0; x_8<len_8; x_8++){ 
    	   try {
    	    RX_byte_8[x_8] = (byte) in_8.read(); // HEX > DEC
    	   } catch (IOException e) {
    	    s_8_RX += "Ошибка read" + "\n";
    	   }
    	  }  
    	 }
    	 cikl_8++; // счёт цикл 5с
    	 }
    	 /////////////////////////////////////////////////////// приёмный буфер len>0:         
    	 if (len_8>0){ 
    	 /////////////////////////////////////////////////////// система: RX


    	 /////////////////////////////////////////////////////// RX > LCD:
    	 s_8_RX += new String(RX_byte_8, 0, len_8) + "\n";    // HEX > String 
    	 /////////////////////////////////////////////////////// система:
    	 }
    	 /////////////////////////////////////////////////////// RX таймаут:
    	 else{
    	  s_8_RX += "Клиент: RX таймаут 5с" + "\n";
    	 };
    	 /////////////////////////////////////////////////////// socket.close(FIN):			
    	 try {
    	  socket_8.close();
    	 } catch (IOException e8) {
    	  s_8_RX += "Ошибка close" + "\n";
    	 }
    	  s_8_RX += "Клиент: (FIN)" + "\n";
    	 ///////////////////////////////////////////////////////// ошибка сокет:
    	 }
    	 s_8_RX += "----------------------------------------------------" + "\n";
       /////////////////////////////////////////////////////////// TX END
    	   
       ////////////////////////////////////////////////////////////// LCD:
       ta.setText(s_8_RX);              // > TextArea 
       ////////////////////////////////////////////////////////////// сброс флаг TCP_Клиент:
       flag_TCP_Клиент = 0;
       //////////////////////////////////////////////////////////////  
     }  			
   }  
}); 
Thready_6.start();	// start поток 6
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
}

