logo

Програмиране на Java Socket

Програмирането на Java Socket се използва за комуникация между приложенията, работещи на различни JRE.

Програмирането на Java Socket може да бъде ориентирано към връзка или без връзка.

Класовете Socket и ServerSocket се използват за програмиране на сокет, ориентирано към свързване, а класовете DatagramSocket и DatagramPacket се използват за програмиране на сокет без връзка.

Клиентът в програмирането на сокет трябва да знае две информации:

  1. IP адрес на сървъра и
  2. Номер на пристанище.

Тук ще направим еднопосочна комуникация клиент и сървър. В това приложение клиентът изпраща съобщение до сървъра, сървърът чете съобщението и го отпечатва. Тук се използват два класа: Socket и ServerSocket. Класът Socket се използва за комуникация между клиент и сървър. Чрез този клас можем да четем и пишем съобщения. Класът ServerSocket се използва от страната на сървъра. Методът accept() на класа ServerSocket блокира конзолата, докато клиентът не се свърже. След успешното свързване на клиента, той връща екземпляра на Socket от страната на сървъра.

Програмиране на сокет в Java

Клас на гнездо

Сокетът е просто крайна точка за комуникация между машините. Класът Socket може да се използва за създаване на сокет.

Важни методи

МетодОписание
1) публичен InputStream getInputStream()връща InputStream, прикачен към този сокет.
2) публичен OutputStream getOutputStream()връща OutputStream, прикачен към този сокет.
3) публичен синхронизиран void close()затваря този сокет

Клас ServerSocket

Класът ServerSocket може да се използва за създаване на сървърен сокет. Този обект се използва за установяване на комуникация с клиентите.

Важни методи

МетодОписание
1) публичен Socket accept()връща сокета и установява връзка между сървър и клиент.
2) публичен синхронизиран void close()затваря сокета на сървъра.

Пример за програмиране на Java Socket

Създаване на сървър:

За да създадем сървърното приложение, трябва да създадем екземпляра на класа ServerSocket. Тук използваме номер на порт 6666 за комуникация между клиента и сървъра. Можете също да изберете всеки друг номер на порт. Методът accept() чака клиента. Ако клиентите се свържат с дадения номер на порт, той връща екземпляр на Socket.

 ServerSocket ss=new ServerSocket(6666); Socket s=ss.accept();//establishes connection and waits for the client 

Създаване на клиент:

За да създадем клиентското приложение, трябва да създадем екземпляра на класа Socket. Тук трябва да предадем IP адреса или името на хоста на сървъра и номер на порт. Тук използваме „localhost“, защото сървърът ни работи на същата система.

 Socket s=new Socket('localhost',6666); 

Нека видим просто програмиране на Java сокет, при което клиентът изпраща текст, а сървърът го получава и отпечатва.

Файл: MyServer.java

 import java.io.*; import java.net.*; public class MyServer { public static void main(String[] args){ try{ ServerSocket ss=new ServerSocket(6666); Socket s=ss.accept();//establishes connection DataInputStream dis=new DataInputStream(s.getInputStream()); String str=(String)dis.readUTF(); System.out.println('message= '+str); ss.close(); }catch(Exception e){System.out.println(e);} } } 

Файл: MyClient.java

 import java.io.*; import java.net.*; public class MyClient { public static void main(String[] args) { try{ Socket s=new Socket('localhost',6666); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); dout.writeUTF('Hello Server'); dout.flush(); dout.close(); s.close(); }catch(Exception e){System.out.println(e);} } } 
изтеглете този пример

За да изпълните тази програма, отворете два командни реда и изпълнете всяка програма на всеки команден ред, както е показано на фигурата по-долу.

След като стартирате клиентското приложение, на конзолата на сървъра ще се покаже съобщение.

Java мрежово програмиране

Пример за програмиране на Java Socket (четене-запис от двете страни)

В този пример клиентът първо ще пише на сървъра, след което сървърът ще получи и отпечата текста. След това сървърът ще пише на клиента и клиентът ще получи и отпечата текста. Стъпката продължава.

Файл: MyServer.java

 import java.net.*; import java.io.*; class MyServer{ public static void main(String args[])throws Exception{ ServerSocket ss=new ServerSocket(3333); Socket s=ss.accept(); DataInputStream din=new DataInputStream(s.getInputStream()); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str='',str2=''; while(!str.equals('stop')){ str=din.readUTF(); System.out.println('client says: '+str); str2=br.readLine(); dout.writeUTF(str2); dout.flush(); } din.close(); s.close(); ss.close(); }} 

Файл: MyClient.java

 import java.net.*; import java.io.*; class MyClient{ public static void main(String args[])throws Exception{ Socket s=new Socket('localhost',3333); DataInputStream din=new DataInputStream(s.getInputStream()); DataOutputStream dout=new DataOutputStream(s.getOutputStream()); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String str='',str2=''; while(!str.equals('stop')){ str=br.readLine(); dout.writeUTF(str); dout.flush(); str2=din.readUTF(); System.out.println('Server says: '+str2); } dout.close(); s.close(); }}