package server;

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 {
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////флаг Синхро:
//static int flag_syn = 0;   
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////поток_6 TX_TCP (Клиент):
static int flag_TCP_Клиент = 0;     
static byte[] RX_byte_6 = new byte[10000]; //Eth//1500  буфер поток = 8192 byte 		    
static int x_6 = 0;     // счёт
static int len_6 = 0;			    
static int cikl_6 = 0;
static String s_6_TX = "";  
static String s_6_RX = "";
static int flag_error_6 = 0;
static String IP_LAN_WAN_6 = "";         // LAN_WAN
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////поток_7 RX_TCP (Сервер):
static int TX_st1;// RX_st счётчик пакетов
static byte[] RX_byte_7 = new byte[10000]; //Eth//1500  буфер поток = 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 = "";
static int flag_Server = 0;
////////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////поток_0: 
public static void main(String[] args) {
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////окно_Консоль:	
final JFrame frame = new JFrame(
"Консоль ");  
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(20, 20, 1000, 545); // x,y,размер,размер 
frame.setLayout(null);
frame.setResizable(false);
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////TextArea "TX_TCP":  
final JTextArea ta = new JTextArea("TX_TCP");    //"текст", 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_TCP":  
final JTextArea ta1 = new JTextArea("RX_TCP");   //"текст", 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 "TX_TCP":
JButton Button_TX_TCP = new JButton("TX_TCP");   
Button_TX_TCP.setBounds(0, 450, 120, 24);                 // x,y,размер,размер  
Button_TX_TCP.setFont(new Font("Dialog", Font.PLAIN, 14));// шрифт
frame.add(Button_TX_TCP);                                 // добавить 
Button_TX_TCP.addActionListener(new ActionListener() {    // Слушатель Button   
public void actionPerformed(ActionEvent event) {
flag_TCP_Клиент = 1; 
}});
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////Button "Сброс":
JButton Button_Сброс = new JButton("Сброс");    
Button_Сброс.setBounds(0, 480, 120, 24);                 // x,y,размер,размер  
Button_Сброс.setFont(new Font("Dialog", Font.PLAIN, 14));// шрифт
frame.add(Button_Сброс);                                 // добавить 
Button_Сброс.addActionListener(new ActionListener() {    // Слушатель Button   
public void actionPerformed(ActionEvent event) {
flag_Server = 0;
}});
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////окно_Консоль:
frame.setVisible(true);     // true/false // включить окно_Консоль           
////////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////поток_6 TX_TCP (Клиент):
Thread Thready_6 = new Thread(new Runnable()
{
public void run()  
{
////////////////////////////////////////////////////////
while(true)
{
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////ждём флаг flag_TCP_Клиент:
while(flag_TCP_Клиент == 0) {
try {Thread.sleep(1000);} catch (Exception e){}  
}; 
////////////////////////////////////////////////////////сокет:
flag_error_6 = 0; // сброс flag_error 
s_6_RX = "\n";
s_6_RX += "TX_TCP-----------------------------------------" + "\n";  
////////////////////////////////////////////////////////TX: IP_LAN_WAN:
//"192.168.0.101";//> SYN  //"ya.ru";//> DNS 

//IP_LAN_WAN_6 = "192.168.0.101";  // LAN  
IP_LAN_WAN_6 = "100.101.6.206";  // LAN 

////////////////////////////////////////////////////////TX: порт:
int port_6 = 8080;  
//создаем сокет: 
s_6_RX += "Клиент: (SYN)" + " Host: " + IP_LAN_WAN_6 + ", port: " + port_6 + "\n";//15c
Socket socket_6 = null;
try {
socket_6 = new Socket(IP_LAN_WAN_6, port_6); 
} catch (UnknownHostException e) {
flag_error_6 = 1;
s_6_RX += "Клиент: Ошибка (DNS) (Неизвестный Host)" + "\n";
} catch (IOException e) {
flag_error_6 = 1;
s_6_RX += "Клиент: Ошибка (SYN) (Host не отвечает)" + "\n";
}
if (flag_error_6 == 0){ // 1 -ошибка сокет			   
////////////////////////////////////////////////////////TX: поток: 
//создаём поток ввода/вывода: 
InputStream in_6 = null;
OutputStream out_6 = null;
try {
in_6 = socket_6.getInputStream();
out_6 = socket_6.getOutputStream();
} catch (IOException e) {
s_6_RX += "Клиент: Ошибка потока" + "\n";
}
////////////////////////////////////////////////////////TX: IP, порт:
//Local_IP, Local_порт
s_6_RX += "Клиент: " + socket_6.getLocalAddress() + ":" + socket_6.getLocalPort();	
//Inet_IP, Inet_порт 
s_6_RX += " >> " + socket_6.getInetAddress() + ":" + socket_6.getPort() + "\n";			   
////////////////////////////////////////////////////////TX: GET:
s_6_TX = "GET /";  
s_6_TX += " HTTP/1.1\r\n";  
////////////////////////////////////////////////////////TX:
////////////////////////Text_TX > буфер
byte[] b_TX_6 = s_6_TX.getBytes();
s_6_RX += "Клиент: TX байт = " + b_TX_6.length + "\n";
////////////////////////Text_TX > LCD
s_6_RX += s_6_TX + "\n";
////////////////////////Text_TX > TX
try {
out_6.write(b_TX_6);
} catch (IOException e) {
s_6_RX += "Ошибка TX" + "\n";
}
////////////////////////////////////////////////////////TX: цикл 5с
cikl_6 = 0;        // сброс цикл 5с
while(cikl_6 < 500)// цикл 5с
{
//останавливает поток на 10ms.
try {Thread.sleep(10);} catch (Exception e){}  
//проверка приёмного буфера
len_6 = 0; // сброс len
try {
//available() получение количество доступных для чтения байтов потока InputStream
len_6 = in_6.available();
} catch (IOException e) {
s_6_RX += "Ошибка available" + "\n";
}
//читаем приёмный буфер 
if (len_6>0){    
if (len_6>1500){len_6=1500;}; // Eth 
s_6_RX += "Клиент: RX байт = " + len_6 + "\n";// RX байт > LCD
cikl_6=500; // сброс цикл 5с
//читаем поток InputStream
for (x_6 = 0; x_6<len_6; x_6++){ 
try {
RX_byte_6[x_6] = (byte) in_6.read(); // HEX > DEC
} catch (IOException e) {
s_6_RX += "Ошибка read" + "\n";
}
}  
}
cikl_6++; // счёт цикл 5с
}
////////////////////////////////////////////////////////приёмный буфер len>0:         
if (len_6>0){ 
////////////////////////////////////////////////////////система: RX


////////////////////////////////////////////////////////RX > LCD:
s_6_RX += new String(RX_byte_6, 0, len_6) + "\n";     //HEX > String 
////////////////////////////////////////////////////////система:
}
////////////////////////////////////////////////////////RX таймаут:
else{
s_6_RX += "Клиент: RX таймаут 5с" + "\n";
};
////////////////////////////////////////////////////////socket.close(FIN):			
try {
//останавливает поток на 10ms.
//try {Thread.sleep(10);} catch (Exception e){}  
socket_6.close();
} catch (IOException e) {
s_6_RX += "Ошибка close" + "\n";
}
s_6_RX += "Клиент: (FIN)" + "\n";
////////////////////////////////////////////////////////ошибка сокет:
}
////////////////////////////////////////////////////////TX END
////////////////////////////////////////////////////////LCD:
//ta.setText(s_6_RX);              // > TextArea 
ta.append(s_6_RX);                 // > TextArea  // добавить
ta.setCaretPosition(ta.getText().length());// автопрокрутка
if (ta.getText().length() > 100000){ta.setText("");};//MAX ta
////////////////////////////////////////////////////////сброс флаг TCP_Клиент:
flag_TCP_Клиент = 0;
////////////////////////////////////////////////////////
}  			
}  
}); 
Thready_6.start();	// start поток 6
////////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////поток_7 RX_TCP (Сервер):
Thread Thready_7 = new Thread(new Runnable()
{
public void run()  
{
////////////////////////////////////////////////////////сервер-сокет:
while(true)
{
s_7_RX = "\n"; 
s_7_RX += "RX_TCP-----------------------------------------" + "\n"; 
//создаём сокет
ServerSocket server_7 = null;
try 
{
server_7 = new ServerSocket(8080);//слушаем порт 8080   
} 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 > 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: цикл 5с
cikl_7 = 0;        // сброс цикл 5с
while(cikl_7 < 500)// цикл 5с
{
//останавливает поток на 10ms.
try {Thread.sleep(10);} catch (Exception e){}  
//проверка приёмного буфера
len_7 = 0; // сброс len
try 
{
//available() получение количество доступных для чтения байтов потока InputStream
len_7 = in_7.available();
} catch (IOException e) {
s_7_RX += "Сервер: Ошибка available" + "\n";
}
//читаем приёмный буфер 
if (len_7>0){    
if (len_7>1500){len_7=1500;}; // Eth 
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";
}
};// for (x_7 = 0; x_7<len_7; x_7++){
};// if (len_7>0){ 
////////////////////////////////////////////////////////цикл 5с
cikl_7 ++; // счёт цикл 5с
}// while(cikl_7 < 500)// цикл 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 счётчик пакетов


/**/
//flag_Server = 1; //Test!
if (flag_Server == 0){
flag_Server = 1;  


s_7 += 
"<!DOCTYPE html>" +
"<html><head><title>Master_0</title></head><body>" +
//"<!---------------------------------------обои------------------------------------------>" +
"<div  id='fon_pult' style='position: absolute; left: 0px; top: 0px; width: 980px; height: 1500px;" + //
"background: #DEB887;'onmousemove = 'mousemove();'>" +

//"<!------------------------------- Data ползунок 1,2 ------------------------------------>" +
"<input id='range_1_Data' type='text' value='127'" +
"style='position: absolute; left: 0px; top: 50px; width: 970px; height: 150px; font-size: 120px;" +
"border: 4px solid maroon; background: #4169E1;'>" + 
"<input id='range_2_Data' type='text' value='127'" +
"style='position: absolute; left: 0px; top: 450px; width: 970px; height: 150px; font-size: 120px;" +
"border: 4px solid maroon; background: #4169E1;'>" + 
//"<!------------------------------- ползунок 1,2 ----------------------------------------->" +
"<div  id='fon_Polzunok1' style='position: absolute; left: 0px; top: 100px; width: 972px; height: 150px;'>" +
"<input id='range_1' type='range' min='0' max='255' step='1' oninput='Polzunok1()' value='127'" +
"style='position: absolute; left: 0px; top: 100px; width: 972px; height: 250px;' >" +
"</div>" +
"<div  id='fon_Polzunok1' style='position: absolute; left: 0px; top: 500px; width: 972px; height: 150px;'>" +
"<input id='range_2' type='range' min='0' max='255' step='1' oninput='Polzunok2()' value='127'" +
"style='position: absolute; left: 0px; top: 100px; width: 972px; height: 250px;' >" +
"</div>" +
//<!-------------------------------------button Taimer_ON ---------------------------------->
"<input id='Taimer_ON' type='button' value='Taimer_ON' onClick='ClickTaimer_ON();'" +
"style='position: absolute; left: 0px; top: 900px;  width: 972px; height: 150px; font-size: 120px;" +
"border: 4px solid maroon;'>" +
//<!-------------------------------------button Taimer_OFF --------------------------------->
"<input id='Taimer_OFF' type='button' value='Taimer_OFF' onClick='ClickTaimer_OFF();'" +
"style='position: absolute; left: 0px; top: 1100px;  width: 972px; height: 150px; font-size: 120px;" +
"border: 4px solid maroon;'>" +


"<script>" +
////////////////////////////////////////счёт  
"var x = 0;" +
"var x1 = 0;" +
////////////////////////////////////////bufer_TX[32]   
"var bufer_TX = [0,0,0,127,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];" +
////////////////////////////////////////String '...'
"var mas_TX = []; mas_TX[0] = '|';" +
////////////////////////////////////////счётчик пакетов
"var st_paket = 0;" +
////////////////////////////////////////


/////////////////////////////////////////////////////////// 0b00000001 > String '001' 
"function abc(x){" +
"if (x > 99) {x = String(x);}" +
"else {" +
"if (x > 9){x = '0' + String(x);}" +
"else      {x = '0' + '0' + String(x);};" +
"};" +
"return x;" +
"}" +
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////Ползунок 1,2:
"function Polzunok1()" +
"{" +
"document.getElementById('range_1_Data').value = document.getElementById('range_1').value;" +
"bufer_TX[3] = document.getElementById('range_1').value;" +  
"}" +
"function Polzunok2() " +
"{" +
"document.getElementById('range_2_Data').value = document.getElementById('range_2').value;" +
"bufer_TX[5] = document.getElementById('range_2').value;" +
"}" +
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////Таймер ON:
"var timerId = 0;" +
"function ClickTaimer_ON()" +
"{" +
"timerId = setInterval(function() {" +
////////////////////////////////////////////////////////////счётчик пакетов
"st_paket++;" +  
"if (st_paket == 256) {st_paket = 0};" +
"bufer_TX[0] = st_paket;" +

"document.getElementById('Taimer_ON').value = st_paket;" +

////////////////////////////////////////////////////////////
//////////////////////0b00000001 > String '001' 
"for(x=0; x<32; x++) {" +
"mas_TX[x] = abc(bufer_TX[x]);" +
"}" +
//////////////////////String '001,001...' > String '001001...' 
"for(x=1; x<32; x++) {" +
"mas_TX[0] += mas_TX[x];" +
"}" +
//////////////////////AJAX_TX: 
"var req = new XMLHttpRequest();" +


//"req.open('GET', ( 'http://192.168.0.101/?' + mas_TX[0]));" + // адрес + Data
"req.open('GET', ( 'http://100.101.6.206:8080/?' + mas_TX[0]));" + // адрес + Data


"req.send(null);" + // (для GET -null) 
//////////////////////
"}," +
"100);" +  // mc
"}" +
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////Таймер_OFF:
"function ClickTaimer_OFF()" +
"{" +
"clearInterval(timerId);" +
"}" +
////////////////////////////////////////////////////////////////////////////////////
"</script>" +
"<!-- fon_pult -->" +
"</div></body></html>";
////////////////////////////////////////////////////////////////////////////////////
}//flag_Server = 0;
////////////////////////////////////////////////////////
else{
s_7 += "404, Not Found";  
};//flag_Server = 1;
////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////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 
{
//останавливает поток на 10ms.
//try {Thread.sleep(10);} catch (Exception e){}  
server_7.close();	
//останавливает поток на 10ms.
//try {Thread.sleep(10);} catch (Exception e){}  
socket_7.close();
} catch (IOException e1) {
s_7_RX += "Сервер: Ошибка close" + "\n";
}

s_7_RX += "Сервер: (FIN)" + "\n";
////////////////////////////////////////////////////////LCD:
//ta1.setText(s_7_RX);              // > TextArea 
ta1.append(s_7_RX);                 // > TextArea  // добавить
ta1.setCaretPosition(ta1.getText().length());// автопрокрутка
if (ta1.getText().length() > 100000){ta1.setText("");};//MAX ta1
////////////////////////////////////////////////////////
}  			
}   
});  
Thready_7.start();	// start поток 7
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
}

