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

Java Socket programming-Transferring Java object through socket using UDP

In the previous chapters we were discussing the fundamentals of networking in Java , with TCP as well as UDP . We discussed the example of transferring object through TCP sockets already.In this chapter we are discussing the Transferring Java object through socket using UDP.

Transferring Java object through socket using UDP

We are discussing the concept with an example.We have a server application as well as client application.The server is a DatagramSocket object and is waiting to get a DatagramPacket.The client creates a Student object and is sending to network as DatagramPacket. The packet should contain the ip address of the machine where our server is running.The server receives the DatagramPacket and converting it back to the Student object. The Student class should implement the Serializable interface as in the previous case .Because here also byte stream to object conversion and object to byte stream conversion is needed.Also the serialVersionUID of Student.java at both sides(server and client) should be same.

Student.java

public class Student implements Serializable

public Student(int id, String name, String address1) this.id = id;
this.name = name;
this.addressLine = address1;
>

private static final long serialVersionUID = 1L;
private int id;
private String name;
private String addressLine;

public int getId() return id;
>

Читайте также:  Команда eval в питоне

public void setId(int id) this.id = id;
>

public String getName() return name;
>

public void setName(String name) this.name = name;
>

public String getAddressLine() return addressLine;
>

public void setAddressLine(String addressLine) this.addressLine = addressLine;
>

public String toString() return «Id = » + getId() + » Name = » + getName() + » Address text-decoration: underline;»>UDPSocketServer.java

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPSocketServer DatagramSocket socket = null;

public void createAndListenSocket() try socket = new DatagramSocket(9876);
byte[] incomingData = new byte[1024];

while (true) DatagramPacket incomingPacket = new DatagramPacket(incomingData, incomingData.length);
socket.receive(incomingPacket);
byte[] data = incomingPacket.getData();
ByteArrayInputStream in = new ByteArrayInputStream(data);
ObjectInputStream is = new ObjectInputStream(in);
try Student student = (Student) is.readObject();
System.out.println(«Student object received Thank you for the message»;
byte[] replyBytea = reply.getBytes();
DatagramPacket replyPacket =
new DatagramPacket(replyBytea, replyBytea.length, IPAddress, port);
socket.send(replyPacket);
Thread.sleep(2000);
System.exit(0);
>

> catch (SocketException e) e.printStackTrace();
> catch (IOException i) i.printStackTrace();
> catch (InterruptedException e) e.printStackTrace();
>
>

public static void main(String[] args) UDPSocketServer server = new UDPSocketServer();
server.createAndListenSocket();
>
>

UDPSocketClient.java

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.*;

public class UDPSocketClient DatagramSocket Socket;

public void createAndListenSocket() try

Socket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName(«localhost»);
byte[] incomingData = new byte[1024];
Student student = new Student(1, «Bijoy», «Kerala»);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(outputStream);
os.writeObject(student);
byte[] data = outputStream.toByteArray();
DatagramPacket sendPacket = new DatagramPacket(data, data.length, IPAddress, 9876);
Socket.send(sendPacket);
System.out.println(«Message sent from client»);
DatagramPacket incomingPacket = new DatagramPacket(incomingData, incomingData.length);
Socket.receive(incomingPacket);
String response = new String(incomingPacket.getData());
System.out.println(«Response from server:» + response);
Thread.sleep(2000);

> catch (UnknownHostException e) e.printStackTrace();
> catch (SocketException e) e.printStackTrace();
> catch (IOException e) e.printStackTrace();
> catch (InterruptedException e) e.printStackTrace();
>
>

public static void main(String[] args) UDPSocketClient client = new UDPSocketClient();
client.createAndListenSocket();
>
>

Output

Use appropriate ip address while constructing datagrampacket object. Start server first and then client.

Output of UDPSocketClient.java

Response from server:Thank you for the message

Output of UDPSocketServer.java

Student object received = Name = Bijoy Address = Kerala

2 thoughts on “ Java Socket programming-Transferring Java object through socket using UDP ”

I have try to run your script.
I’ve an error when send the file larger than 16KB.
Why? and how to resolve? Best Regards. Roni

I dont know if this is still useful, but its nothing to do with the code but with udp. UDP does not guarantee delivery of packets. Look into TCP.

Источник

Русские Блоги

Передача Java-объекта через сокет (сериализация объекта)

Эта статья в основном реализует j: передачу Java-объектов через сокеты. Используемый метод — сериализация объекта. Метод: через сокет

• установить соединение c / s, читать и записывать объекты через ObjectOutputStream, ObjectOutputStream. Единственное, на что стоит обратить внимание, это пройденная Java

Объект должен реализовывать интерфейс Serializable mark.

package com.yt.manager.Serializable; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; /** * @ Описание: сокет на стороне сервера * @ClassName: Server * @Project: base-info * @Author: zxf * @Date: 2011-7-15 */ public class Server < public static void main(String[] args) < ServerSocket serverSocket = null; Socket socket = null; ObjectInputStream objInputStream = null; ObjectOutputStream objOutputStream = null; try < serverSocket = new ServerSocket(11111); System.out.println («Служба сервера запущена . »); socket = serverSocket.accept(); // Десериализация объектов, написанных клиентом с использованием ObjectOutputStream objInputStream = new ObjectInputStream(socket.getInputStream()); Customer cusotmer = (Customer) objInputStream.readObject(); cusotmer.setName ("Hello:" + cusotmer.getName ()); objOutputStream = new ObjectOutputStream(socket.getOutputStream()); objOutputStream.writeObject(cusotmer); >catch (Exception e) < e.printStackTrace(); >finally < try < serverSocket.close(); socket.close(); >catch (IOException e) < e.printStackTrace(); >> > > 
package com.yt.manager.Serializable; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; /** * @ Описание: сокет на стороне сервера * @ClassName: Server * @Project: base-info * @Author: zxf * @Date: 2011-7-15 */ public class Server < public static void main(String[] args) < ServerSocket serverSocket = null; Socket socket = null; ObjectInputStream objInputStream = null; ObjectOutputStream objOutputStream = null; try < serverSocket = new ServerSocket(11111); System.out.println («Служба сервера запущена . »); socket = serverSocket.accept(); // Десериализация объектов, написанных клиентом с использованием ObjectOutputStream objInputStream = new ObjectInputStream(socket.getInputStream()); Customer cusotmer = (Customer) objInputStream.readObject(); cusotmer.setName ("Hello:" + cusotmer.getName ()); objOutputStream = new ObjectOutputStream(socket.getOutputStream()); objOutputStream.writeObject(cusotmer); >catch (Exception e) < e.printStackTrace(); >finally < try < serverSocket.close(); socket.close(); >catch (IOException e) < e.printStackTrace(); >> > > 
package com.yt.manager.Serializable; import java.io.Serializable; /** * @Description: реализовать интерфейс сериализации * @ClassName: Customer * @Project: base-info * @Author: zxf * @Date: 2011-5-30 */ public class Customer implements Serializable < private static final long serialVersionUID = 1L; public String name; public int age; public String getName() < return name; >public void setName(String name) < this.name = name; >public int getAge() < return age; >public void setAge(int age) < this.age = age; >> 

Источник

Передача через 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.
*/

Источник

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