GrabDuck

Работа с Сокетами в Java

:

        

// Очень простой сервер, который только

// отображает то, что посылает клиент.

import java.io.* ;

import java.net.* ;

public class JabberServer {

// Выбираем номер порта за пределами 1-1024:

public static final int PORT = 8080 ;

public static void main ( String [] args ) throws IOException {

ServerSocket s = new ServerSocket ( PORT );

System . out . println ( "Started: " + s );

try {

// Блокируем пока не произойдет соединение:

Socket socket = s . accept ();

try {

System . out . println ( "Connection accepted: " + socket );

BufferedReader in = new BufferedReader (

new InputStreamReader (

socket . getInputStream ()));

// Вывод автоматически обновляется

// классом PrintWriter:

PrintWriter out = new PrintWriter (

new BufferedWriter (

new OutputStreamWriter (

socket . getOutputStream ())), true );

while ( true ) {

String str = in . readLine ();

if ( str . equals ( "END" )) break ;

System . out . println ( "Echoing: " + str );

out . println ( str );

}

// всегда закрываем оба сокета...

} finally {

System . out . println ( "closing..." );

socket . close ();

}

} finally {

s . close ();

}

}

}

// Очень простой клиент, который просто отсылает строки серверу

// и читает строки, которые посылает сервер

import java.net.* ;

import java.io.* ;

public class JabberClient {

public static void main ( String [] args ) throws IOException {

// Установка параметра в null в getByName()

// возвращает специальный IP address - "Локальную петлю",

// для тестирования на одной машине без наличия сети

InetAddress addr = InetAddress . getByName ( null );

System . out . println ( "addr = " + addr );

Socket socket = new Socket ( addr , JabberServer . PORT );

// Окружаем все блоками try-finally

// чтобы убедиться что сокет закрывается:

try {

System . out . println ( "socket = " + socket );

BufferedReader in = new BufferedReader (

new InputStreamReader (

socket . getInputStream ()));

// Вывод автоматически сбрасывается

// с помощью PrintWriter:

PrintWriter out = new PrintWriter (

new BufferedWriter (

new OutputStreamWriter (

socket . getOutputStream ())), true );

for ( int i = 0 ; i < 10 ; i ++) {

out . println ( "howdy " + i );

String str = in . readLine ();

System . out . println ( str );

}

out . println ( "END" );

} finally {

System . out . println ( "closing..." );

socket . close ();

}

}

}

////////////////////////////////////////////////////////////////////////////////////////////////////////

// Сервер, использующий многопоточность

// для обслуживания любого числа клиентов.

import java.io.* ;

import java.net.* ;

class ServeOneJabber extends Thread {

private Socket socket ;

private BufferedReader in ;

private PrintWriter out ;

public ServeOneJabber ( Socket s ) throws IOException {

socket = s ;

in = new BufferedReader ( new InputStreamReader ( socket . getInputStream ()));

// Включение автосброса буферов:

out = new PrintWriter ( new BufferedWriter ( new OutputStreamWriter ( socket . getOutputStream ())), true );

// Если какой либо, указанный выше класс выбросит исключение

// вызывающая процедура ответственна за закрытие сокета

// В противном случае нить(поток) закроет его.

start (); // Вызывает run()

}

public void run () {

try {

while ( true ) {

String str = in . readLine ();

if ( str . equals ( "END" )) break ;

System . out . println ( "Echoing: " + str );

out . println ( str );

}

System . out . println ( "closing..." );

} catch ( IOException e ) {

System . err . println ( "IO Exception" );

} finally {

try {

socket . close ();

} catch ( IOException e ) {

System . err . println ( "Socket not closed" );

}

}

}

}

public class MultiJabberServer {

static final int PORT = 8080 ;

public static void main ( String [] args ) throws IOException {

ServerSocket s = new ServerSocket ( PORT );

System . out . println ( "Server Started" );

try {

while ( true ) {

// Останавливает выполнение, до нового соединения:

Socket socket = s . accept ();

try {

new ServeOneJabber ( socket );

} catch ( IOException e ) {

// Если неудача - закрываем сокет, в противном случае нить закроет его:

socket . close ();

}

}

} finally {

s . close ();

}

}

}