Инструменты пользователя

Инструменты сайта


java_socket

Назад

Введение

Socket = ip-adress + port;

Сокеты позволяют организовать тесное взаимодействие клиента и сервера в полноценных приложениях Java, при котором клиент-сервер могут предавать друг другу данные через сеть Internet. Каждая рабочая станция может выступать одновременно и в роли сервера, и в роли клиента.

Сервер

public class Server
{
 
    public static void main(String[] args) throws IOException
    {
        int port = 9999;
        ServerSocket ss = new ServerSocket(port);
 
        Socket s = ss.accept();
        System.out.println("Подключился Клиент");
 
        DataInputStream in = new DataInputStream(s.getInputStream());
        DataOutputStream out = new DataOutputStream(s.getOutputStream());
 
        //Считываем с клавиатуры
        BufferedReader key = new BufferedReader(new InputStreamReader(System.in,"Cp1251"));
 
        String msg = null;
        while(true)
        {
            //Получаем сообщение от клиента
            msg = in.readUTF();
            System.out.println("Сообщение:"+msg);
            //Пишим сообщение клиенту
            msg = key.readLine();
            out.writeUTF(msg);
            out.flush();
        }
    }
}   

Клиент

public class Client
{
    public static void main(String[] args) throws IOException
    {
        String host = "localhost";
        int port = 9999;
 
        Socket s = new Socket(host,port);
 
        DataInputStream in = new DataInputStream(s.getInputStream());
        DataOutputStream out = new DataOutputStream(s.getOutputStream());
 
        BufferedReader key = new BufferedReader(new InputStreamReader(System.in,"Cp1251"));
 
        String msg = null;
 
        while(true)
        {
            //Пиши серверу
            msg = key.readLine();
            out.writeUTF(msg);
            out.flush();
 
            //Получаем сообщение
            System.out.println("Сообщение:"+in.readUTF());
        }
    }
}

Пример

В потоке исполнения

В данном примере показано как нужно обрабатывать сразу несколько одновременных подключений: сокет каждого нового подключения посылается на обработку отдельному вычислительному потоку.

Server
import java.io.*;
import java.net.*;
 
class Server extends Thread
{
 
    Socket s;
    int num;
 
    public static void main(String args[])
    {
        try
        {
            int i = 0; // счётчик подключений
 
            // привинтить сокет на локалхост, порт 3128
            ServerSocket server = new ServerSocket(3128, 0, InetAddress.getByName("localhost"));
 
            System.out.println("server is started");
 
            // слушаем порт
            while (true)
            {
                // ждём нового подключения, после чего запускаем обработку клиента
                // в новый вычислительный поток и увеличиваем счётчик на единичку
                new Server(i, server.accept());
                i++;
            }
        } catch (Exception e)
        {
            System.out.println("init error: " + e);
        } // вывод исключений
    }
 
    public Server(int num, Socket s)
    {
        // копируем данные
        this.num = num;
        this.s = s;
 
        // и запускаем новый вычислительный поток (см. ф-ю run())
        setDaemon(true);
        setPriority(NORM_PRIORITY);
        start();
    }
 
    public void run()
    {
        try
        {
            // из сокета клиента берём поток входящих данных
            InputStream is = s.getInputStream();
            // и оттуда же - поток данных от сервера к клиенту
            OutputStream os = s.getOutputStream();
 
            // буффер данных в 64 килобайта
            byte buf[] = new byte[64 * 1024];
            // читаем 64кб от клиента, результат - кол-во реально принятых данных
            int r = is.read(buf);
 
            // создаём строку, содержащую полученную от клиента информацию
            String data = new String(buf, 0, r);
 
            // добавляем данные об адресе сокета:
            data = "" + num + ": " + "\n" + data;
 
            // выводим данные:
            os.write(data.getBytes());
 
            // завершаем соединение
            s.close();
        } catch (Exception e)
        {
            System.out.println("init error: " + e);
        } // вывод исключений
    }
}
client
import java.io.IOException;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
 
public class Client
{
 
    public static void main(String[] args) throws IOException
    {
        // открываем сокет и коннектимся к localhost:3128
        // получаем сокет сервера
        Socket s = new Socket("localhost", 3128);
 
        // берём поток вывода и выводим туда первый аргумент
        // заданный при вызове, адрес открытого сокета и его порт
        String str = s.getInetAddress().getHostAddress() + ":" + s.getLocalPort();
        char[] buffer = str.toCharArray();
        byte[] b = new byte[buffer.length];
        for (int i = 0; i < b.length; i++)
        {
            b[i] = (byte) buffer[i];
        }
 
        // читаем ответ
        s.getOutputStream().write(b);
 
        // читаем ответ
        byte buf[] = new byte[64 * 1024];
        int r = s.getInputStream().read(buf);
        String data = new String(buf, 0, r);
 
        // выводим ответ в консоль
        System.out.println(data);
    }
}

HTTP клиент

В данном примере я хочу показать как нужна общаться с web-сервером по средством сокетов и заголовках.

HttpClient
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
 
public class HttpClient
{
 
    public static void main(String args[]) throws FileNotFoundException, IOException
    {
        Socket s = new Socket("ya.ru", 80);
        PrintWriter pw = new PrintWriter(s.getOutputStream());
        pw.println("GET / HTTP/1.1");
        pw.println("Host: ya.ru");
        pw.println("");
        pw.flush();
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String t;
        while ((t = br.readLine()) != null)
        {
            System.out.println(t);
        }
        br.close();
        pw.close();
        s.close();
 
    }
}

Передача файла по сети

server
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server
{
 
    public static void main(String[] args) throws IOException
    {
        int port = 9999;
        ServerSocket ss = new ServerSocket(port);
 
        Socket s = ss.accept();
        System.out.println("Подключился Клиент");
 
        InputStream in = new FileInputStream("C://java_in.txt");
        OutputStream out = s.getOutputStream();
 
        int c =0;
        while((c = in.read()) >=0)
        {
            out.write(c);
            out.flush();        
        }
        System.out.println("Файл передан");
        out.close();
        in.close();
        s.close();
        ss.close();
    }
}   
client
import java.io.FileOutputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
 
public class Client
{
    public static void main(String[] args) throws IOException
    {
        String host = "localhost";
        int port = 9999;
 
        Socket s = new Socket(host,port);
 
        InputStream in = s.getInputStream();
        FileOutputStream out = new FileOutputStream("C://java_out.txt");
 
        int c =0;
        while((c = in.read()) >=0)
        {
            out.write((char)c);
        }
        out.close();
        in.close();
        s.close();
 
    }
}