java tutorial - Руководство Программирование Java Socket - учебник java - java programming - учиться java - java basics - java for beginners



1- Что такое Socket?

На стороне сервера (server-side):

  • Обычно сервер работающий на определенном компьютере, имеет серверный сокет (Server Socket), привязанный к определенному номеру порта (Port number). Серверные программы (Server program) просто ждут, слушая серверный сокет (Server Socket) для клиента, чтобы выполнить запрос соединения.

На стороне клиента (client-side):

  • Клиент знает имя машины, на которой работает сервер (server), и номер порта, на котором сервер прослушивает. Чтобы сделать запрос на соединение, клиент пытается встретиться с сервером на компьютере и в порту сервера. Клиент также должен идентифицировать себя с сервером, чтобы он связался с локальным портом, который будет использоваться во время этого соединения. Обычно это назначается операционной системой.
 сокет сервера Java
java - джава - учиться java - учебник java -
сокет сервера Java
- примеры java - java-программы
  • Общая иллюстрация:
 программы Java сервера сокета
java - джава - учиться java - учебник java -
программы Java сервера сокета
- примеры java - java-программы
  • Если все пройдет хорошо, серверная программа (server program) примет соединение клиента. После принятия сервер получает новый сокет, привязанный к тому же локальному порту, а также его удаленная конечная точка (remote endpoint) является адресом и портом клиента. Он создал новый сокет, чтобы заботиться о клиента, который только что принял соединение, и мог продолжать прослушивать исходный сокет (ServerSocket) для других запросов на подключение.
 подключение сокета сервера Java
java - джава - учиться java - учебник java -
подключение сокета сервера Java
- примеры java - java-программы
  • На стороне клиента, если соединение принято, сокет успешно создается, и клиент может использовать сокет для связи с серверной программой. Теперь клиент и сервер могут взаимодействовать, записывая или читая их сокеты (Socket).
 сокет клиента
java - джава - учиться java - учебник java -
сокет клиента
- примеры java - java-программы
  • Данные, записанные в выходной поток на Socket клиента, будут поступать на входной поток Socket на сервере. И наоборот, данные, записываемые в выходной поток на Socket на сервере, будут передаваться в входной поток Socket клиента.

2- Простой пример с Socket

SimpleServerProgram.java

package com.wikitechy.tutorial.socket;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
public class SimpleServerProgram {
 
   public static void main(String args[]) {
 
       ServerSocket listener = null;
       String line;
       BufferedReader is;
       BufferedWriter os;
       Socket socketOfServer = null;
 
       // Try to open a server socket on port 9999
       // Note that we can't choose a port less than 1023 if we are not
       // privileged users (root)
 
  
       try {
           listener = new ServerSocket(9999);
       } catch (IOException e) {
           System.out.println(e);
           System.exit(1);
       }
 
       try {
           System.out.println("Server is waiting to accept user...");
 
           // Accept client connection request
           // Get new Socket at Server.    
           socketOfServer = listener.accept();
           System.out.println("Accept a client!");
 
           // Open input and output streams
           is = new BufferedReader(new InputStreamReader(socketOfServer.getInputStream()));
           os = new BufferedWriter(new OutputStreamWriter(socketOfServer.getOutputStream()));
 
 
           while (true) {
               // Read data to the server (sent from client).
               line = is.readLine();
                
               // Write to socket of Server
               // (Send to client)
               os.write(">> " + line);
               // End of line
               os.newLine();
               // Flush data.
               os.flush();  
 
 
               // If users send QUIT (To end conversation).
               if (line.equals("QUIT")) {
                   os.write(">> OK");
                   os.newLine();
                   os.flush();
                   break;
               }
           }
 
       } catch (IOException e) {
           System.out.println(e);
           e.printStackTrace();
       }
       System.out.println("Sever stopped!");
   }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

SimpleClientDemo.java

package com.wikitechy.tutorial.socket;
 
import java.io.*;
import java.net.*;
 
public class SimpleClientDemo {
 
   public static void main(String[] args) {
 
       // Server Host
       final String serverHost = "localhost";
 
       Socket socketOfClient = null;
       BufferedWriter os = null;
       BufferedReader is = null;
 
       try {
            
           // Send a request to connect to the server is listening
           // on machine 'localhost' port 9999.
           socketOfClient = new Socket(serverHost, 9999);
 
           // Create output stream at the client (to send data to the server)
           os = new BufferedWriter(new OutputStreamWriter(socketOfClient.getOutputStream()));
 
 
           // Input stream at Client (Receive data from the server).
           is = new BufferedReader(new InputStreamReader(socketOfClient.getInputStream()));
 
       } catch (UnknownHostException e) {
           System.err.println("Don't know about host " + serverHost);
           return;
       } catch (IOException e) {
           System.err.println("Couldn't get I/O for the connection to " + serverHost);
           return;
       }
 
       try {
 
           // Write data to the output stream of the Client Socket.
           os.write("HELO");
  
           // End of line
           os.newLine();
    
           // Flush data.
           os.flush();  
           os.write("I am Tom Cat");
           os.newLine();
           os.flush();
           os.write("QUIT");
           os.newLine();
           os.flush();
 
 
            
           // Read data sent from the server.
           // By reading the input stream of the Client Socket.
           String responseLine;
           while ((responseLine = is.readLine()) != null) {
               System.out.println("Server: " + responseLine);
               if (responseLine.indexOf("OK") != -1) {
                   break;
               }
           }
 
           os.close();
           is.close();
           socketOfClient.close();
       } catch (UnknownHostException e) {
           System.err.println("Trying to connect to unknown host: " + e);
       } catch (IOException e) {
           System.err.println("IOException:  " + e);
       }
   }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

Запуск примера:

  • Для начала вам нужно запустить класс SimpleServerProgram:
 Демонстрация простого сервера
java - джава - учиться java - учебник java -
Демонстрация простого сервера
- примеры java - java-программы
  • Затем запустить класс SimpleClientDemo.
 простой клиент демо
java - джава - учиться java - учебник java -
простой клиент демо
- примеры java - java-программы

3- Пример Socket + Thread

  • Обычно создается соединение между серверной программой (Server) и 1 клиентом, вы должны позволить им говорить друг с другом в потоке (Thread), поэтому каждый раз при создании нового соединения, создается ноый поток.

ServerProgram.java

package com.wikitechy.tutorial.socketthread;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
public class ServerProgram {
 
   public static void main(String args[]) throws IOException {
 
       ServerSocket listener = null;
 
       System.out.println("Server is waiting to accept user...");
       int clientNumber = 0;
 
       // Try to open a server socket on port 7777
       // Note that we can't choose a port less than 1023 if we are not
       // privileged users (root)
 
       try {
           listener = new ServerSocket(7777);
       } catch (IOException e) {
           System.out.println(e);
           System.exit(1);
       }
 
       try {
           while (true) {
               // Accept client connection request
               // Get new Socket at Server.
 
               Socket socketOfServer = listener.accept();
               new ServiceThread(socketOfServer, clientNumber++).start();
           }
       } finally {
           listener.close();
       }
 
   }
 
   private static void log(String message) {
       System.out.println(message);
   }
 
   private static class ServiceThread extends Thread {
 
       private int clientNumber;
       private Socket socketOfServer;
 
       public ServiceThread(Socket socketOfServer, int clientNumber) {
           this.clientNumber = clientNumber;
           this.socketOfServer = socketOfServer;
 
           // Log
           log("New connection with client# " + this.clientNumber + " at " + socketOfServer);
       }
 
       @Override
       public void run() {
 
           try {
 
               // Open input and output streams
               BufferedReader is = new BufferedReader(new InputStreamReader(socketOfServer.getInputStream()));
               BufferedWriter os = new BufferedWriter(new OutputStreamWriter(socketOfServer.getOutputStream()));
 
               while (true) {
                   // Read data to the server (sent from client).
                   String line = is.readLine();
                    
                   // Write to socket of Server
                   // (Send to client)                    
                   os.write(">> " + line);
                   // End of line.
                   os.newLine();
                   // Flush data.
                   os.flush();
 
            
                   // If users send QUIT (To end conversation).
                   if (line.equals("QUIT")) {
                       os.write(">> OK");
                       os.newLine();
                       os.flush();
                       break;
                   }
               }
 
           } catch (IOException e) {
               System.out.println(e);
               e.printStackTrace();
           }
       }
   }
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

ClientDemo.java

package com.wikitechy.tutorial.socketthread;
 
import java.io.*;
import java.net.*;
import java.util.Date;
 
public class ClientDemo {
 
   public static void main(String[] args) {
 
  
       final String serverHost = "localhost";
 
       Socket socketOfClient = null;
       BufferedWriter os = null;
       BufferedReader is = null;
 
       try {
      
            
           // Send a request to connect to the server is listening
           // on machine 'localhost' port 7777.            
           socketOfClient = new Socket(serverHost, 7777);
      
           // Create output stream at the client (to send data to the server)
           os = new BufferedWriter(new OutputStreamWriter(socketOfClient.getOutputStream()));
 
      
           // Input stream at Client (Receive data from the server).
           is = new BufferedReader(new InputStreamReader(socketOfClient.getInputStream()));
 
       } catch (UnknownHostException e) {
           System.err.println("Don't know about host " + serverHost);
           return;
       } catch (IOException e) {
           System.err.println("Couldn't get I/O for the connection to " + serverHost);
           return;
       }
 
       try {
    
           // Write data to the output stream of the Client Socket.
           os.write("HELO! now is " + new Date());
        
           // End of line
           os.newLine();
        
           // Flush data.
           os.flush();  
           os.write("I am Tom Cat");
           os.newLine();
           os.flush();
           os.write("QUIT");  
           os.newLine();
           os.flush();
 
      
            
           // Read data sent from the server.
           // By reading the input stream of the Client Socket.
           String responseLine;
           while ((responseLine = is.readLine()) != null) {
               System.out.println("Server: " + responseLine);
               if (responseLine.indexOf("OK") != -1) {
                   break;
               }
           }
 
           os.close();
           is.close();
           socketOfClient.close();
       } catch (UnknownHostException e) {
           System.err.println("Trying to connect to unknown host: " + e);
       } catch (IOException e) {
           System.err.println("IOException:  " + e);
       }
   }
 
}
нажмите кнопку ниже, чтобы скопировать код. - от - java tutorials - команда

Related Searches to Руководство Программирование Java Socket