Передача объектов через сокеты java

Обмен данными по сети на основе сокетов в Java

Передача данных — одна из краеугольных задач информационных технологий. От неё зависит как работа компаний, так и повседневная жизнь обычных людей.

Для решения этой задачи Java предоставляет различные механизмы, среди которых особое место занимают сокеты.

Сокет (англ. socket — разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения (Википедия).

Ключевое отличие сокетов от других сетевых инструментов Java (таких как HttpRequest, SMTPTransport и др.) состоит в том, что:

  • Сокеты представляют собой достаточно низкоуровневый интерфейс.
    Это позволяет работать напрямую через протокол TCP/IP и тем самым обеспечивает универсальность.
  • Сокеты позволяют обеспечить обмен данными в режиме достаточно приближенном к реальному времени.
    При отсутствии задержек при обработке и передачи данных обмен происходит с очень высокой скоростью.

Недостаток сокетов, по сути является продолжением их достоинств. Универсальность и работа на низком уровне неизбежно порождает неудобство при работе с распространёнными протоколами (того же HTTP) . Поэтому для них лучше использовать высокоуровневые средства. Но, подобные протоколы, к сожалению, не покрывают весь спектр задач сетевого программирования. Поэтому программирование на сокетах по-прежнему остаётся актуальным.

Ниже мы рассмотрим примеры создания и работы серверных и клиентских сокетов на примере несложного клиент-серверного приложения.

Серверная часть

Существует два вида сокетов. Серверные и клиентские. В этой части мы рассмотрим серверные сокеты.

Серверные сокеты реализуются на основе класса ServerSocket. Они прослушивают определённый порт и по получении данных от клиента могут сформировать и передать ответ.

Читайте также:  Найти предпоследнюю цифру числа python

Ниже приведён пример создания серверного сокета для 5000 порта.

Источник

Передача через Socket объекта?

Пишу мессенджер(исключительно в качестве практики) и возникла проблема — сейчас он реализован для передачи только строковых данных, но на данном этапе это уже не подходит. На сервер и обратно как минимум хотелось бы передавать целые объекты — например, объект отвечающий за регистрацию(некий класс, который будет хранить нужное количество информации для этой регистрации), отвечающий за вход, за рассылку всем клиентам, за отправку сообщения конкретному пользователю(Нужно передать, как минимум, сообщение и id пользователя, которому буду передавать) ну и так далее. Первая моя мысль — объекты наследников класса «Messеge» которые и будут выполнять эти функции, соответственно массив байт на клиенте, дешифровка на стороне сервера, но мне очень не хотелось бы делать это абы как, хотелось бы сделать так, как это стоило бы сделать, вне зависимости от степени сложности. Возможно стоит вообще передавать JSON-ы и парсить их на сервере? Или что-то еще? рад буду любым ответам, наставлениям, рекомендациям и советам. Собственно, всё пляшет от того, что нижеприведенный метод уже не даёт нужного функционала и вместо public synchronized void sendMessege(String messege) как минимум нужен public synchronized void sendMessege(Object messege), и соответственно новая реализация, осталось выяснить насколько такое решение плохое и/или чем его лучше заменить. Заранее всем спасибо!

public synchronized void sendMessege(String messege) < /** * Метод для отправки сообщений */ try < out.write(messege+ "\r\n"); out.flush(); >catch (IOException e) < listener.sExeption(e); >>

jamakasi666

1) Если хочется своего колхоза то имплементируйте в нужный класс интерфейс Serializable, на стороне передачи будет нечто

ObjectOutputStream out . ; out.writeObject(object);
ObjectInputStream in . ; YouClass object = (YouClass)in.readObject();

2) Если хочется взять готовенькое то смотри в сторону kryonet, все быстро и просто.
3) Если все же хочется своего но не особо хочется морочиться с сериализацией то смотри protobuf.
4) Еще можно пойти классическим путем. В классе который хотите передавать создаете конструктор с нужными полями, дальше этот класс перегоняете в json\xml\обычным массивом текста с разделителями и передаете строкой, на принимающей строке разбираете эту строку и создаете объект через конструктор. Для автоматизации можно взять к примеру Gson в котором все сведется к такому виду

public static class Entity < int id; String name; //другие типы и данные, если класс то аналогичным образом описываете public Entity(int id, String name) < this.id = id; this.name = name; >>String json = gson.toJson(entity); // Entity read = gson.fromJson(json, Entity.class);

Источник

chatton / SendObjectsOverSockets.java

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

import java . io . Serializable ;
// must implement Serializable in order to be sent
public class Message implements Serializable
private final String text ;
public Message ( String text )
this . text = text ;
>
public String getText ()
return text ;
>
>
import java . io .*;
import java . net . Socket ;
import java . util . ArrayList ;
import java . util . List ;
public class Client
public static void main ( String [] args ) throws IOException
// need host and port, we want to connect to the ServerSocket at port 7777
Socket socket = new Socket ( «localhost» , 7777 );
System . out . println ( «Connected!» );
// get the output stream from the socket.
OutputStream outputStream = socket . getOutputStream ();
// create an object output stream from the output stream so we can send an object through it
ObjectOutputStream objectOutputStream = new ObjectOutputStream ( outputStream );
// make a bunch of messages to send.
List < Message >messages = new ArrayList <>();
messages . add ( new Message ( «Hello from the other side!» ));
messages . add ( new Message ( «How are you doing?» ));
messages . add ( new Message ( «What time is it?» ));
messages . add ( new Message ( «Hi hi hi hi.» ));
System . out . println ( «Sending messages to the ServerSocket» );
objectOutputStream . writeObject ( messages );
System . out . println ( «Closing socket and terminating program.» );
socket . close ();
>
>
import java . io .*;
import java . net . ServerSocket ;
import java . net . Socket ;
import java . util . List ;
public class Server
public static void main ( String [] args ) throws IOException , ClassNotFoundException
// don’t need to specify a hostname, it will be the current machine
ServerSocket ss = new ServerSocket ( 7777 );
System . out . println ( «ServerSocket awaiting connections. » );
Socket socket = ss . accept (); // blocking call, this will wait until a connection is attempted on this port.
System . out . println ( «Connection from » + socket + «!» );
// get the input stream from the connected socket
InputStream inputStream = socket . getInputStream ();
// create a DataInputStream so we can read data from it.
ObjectInputStream objectInputStream = new ObjectInputStream ( inputStream );
// read the list of messages from the socket
List < Message >listOfMessages = ( List < Message >) objectInputStream . readObject ();
System . out . println ( «Received [» + listOfMessages . size () + «] messages from: » + socket );
// print out the text of every message
System . out . println ( «All messages:» );
listOfMessages . forEach (( msg )-> System . out . println ( msg . getText ()));
System . out . println ( «Closing sockets.» );
ss . close ();
socket . close ();
>
>
// Server output
/*
ServerSocket awaiting connections.
Connection from Socket[addr=/127.0.0.1,port=62360,localport=7777]!
Received [4] messages from: Socket[addr=/127.0.0.1,port=62360,localport=7777]
All messages:
Hello from the other side!
How are you doing?
What time is it?
Hi hi hi hi.
Closing sockets.
*/
// Client output
/*
Connected!
Sending messages to the ServerSocket
Closing socket and terminating program.
*/

Источник

Оцените статью