20.09.2015, 11:55. Показов 463. Ответов 0
Доброго времени суток, получил задание по лабораторной работе. Создать своего рода клиент серверное приложение используя Брокера. Смысл в том,что бы отправитель читал данные их XML файла (асинхронно), отправлял их Брокеру(тоже асинхронно) ,а Брокер в свою очередь отправлял полученные данные Получателю. Требования к заданию такие что, должна быть реализована модульность,то есть отдельный класс для работы с XML файлами,отдельный класс для работы по пересылке и чтению данных. Асинхронность можно реализовать реализовать по средству потоков.
Приложу,то что я сделал.
Проект Sender. Класс XMLWorking.java
| Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
| /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package sender_3;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
*
* @author Iachimov Alex
*/
public class XMLWorking {
public String path;
public XMLWorking(){
}
public XMLWorking(String p){
this.path = p;
}
public String getPath(){
return this.path;
}
public void createXML() throws ParserConfigurationException, TransformerConfigurationException, TransformerException{
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
Element element1 = document.createElement("LabWork_1");
document.appendChild(element1);
Attr attr1 = document.createAttribute("ID");
attr1.setValue("1");
element1.setAttributeNode(attr1);
Element a = document.createElement("a");
Element b = document.createElement("b");
a.appendChild(document.createTextNode("1"));
b.appendChild(document.createTextNode("2"));
element1.appendChild(a);
element1.appendChild(b);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult streamResult = new StreamResult(new File(path)); //Ex = "C:\\XML\\data.xml"
transformer.transform(source, streamResult);
}
public String readXML() throws SAXException, IOException, ParserConfigurationException{
String text = null;
File xmlFile = new File(path);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(xmlFile);
NodeList list = document.getElementsByTagName("LabWork_1");
for(int i=0;i<=list.getLength();i++){
Node node = list.item(i);
if(node.getNodeType()== Node.ELEMENT_NODE){
Element element = (Element) node;
text = element.getTagName() +" " + element.getAttribute("ID") + " " + element.getElementsByTagName("a").item(0).getTextContent() + " " + element.getElementsByTagName("b").item(0).getTextContent();
return text;
}
}
return text;
}
public void writeXML(String name,String text) throws ParserConfigurationException, TransformerConfigurationException, TransformerException{
String[] parts = text.split(" ");
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
Element element1 = document.createElement(parts[0]);
document.appendChild(element1);
Attr attr1 = document.createAttribute("ID");
attr1.setValue(parts[1]);
element1.setAttributeNode(attr1);
Element a = document.createElement("a");
Element b = document.createElement("b");
a.appendChild(document.createTextNode(parts[2]));
b.appendChild(document.createTextNode(parts[3]));
element1.appendChild(a);
element1.appendChild(b);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult streamResult = new StreamResult(new File(name)); //Ex = "C:\\XML\\data.xml"
transformer.transform(source, streamResult);
}
} |
|
Проект Sender. Класс Netwoking.java
| Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
| /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package sender_3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
/**
*
* @author Iachimov Alex
*/
public class Networking implements Runnable{
XMLWorking x = null;
BufferedReader in= null;
PrintWriter out= null;
ServerSocket serverSocket = null;
Socket socket = null;
Integer port = null;
String msg = null;
String adress = null;
public Networking(String adress,Integer port ){
this.port = port;
this.adress = adress;
}
public Networking(Socket socket){
this.socket= socket;
}
public Networking(Integer p){
this.port= p;
}
public void sendMessage (String s) throws IOException{
socket = new Socket(InetAddress.getByName(adress), port);
out=new PrintWriter(socket.getOutputStream(), true);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println(s);
out.close();
in.close();
socket.close();
}
public String readMessage(){
try {
serverSocket = new ServerSocket(port,10);
} catch (IOException ex) {
Logger.getLogger(Networking.class.getName()).log(Level.SEVERE, null, ex);
System.out.println("Невозможно подключиться к порту.");
System.exit(-1);
}
while(true){
try{
System.out.print("Ожидание ...");
socket= serverSocket.accept();
Runnable runnable = new Networking(socket);
Thread thread = new Thread(runnable);
thread.start();
System.out.println("Присоеденился");
} catch(IOException e) {
System.out.println("Невозможно присоедениться");
System.exit(-1);
}
}
}
@Override
public void run() {
x = new XMLWorking();
try{
in= new BufferedReader(new
InputStreamReader(socket.getInputStream()));
out= new PrintWriter(socket.getOutputStream(),true);
String input;
while((input = in.readLine()) != null) {
System.out.println(input);
try {
x.writeXML("C:\\XML\\data2.xml", input);
} catch (ParserConfigurationException ex) {
Logger.getLogger(Networking.class.getName()).log(Level.SEVERE, null, ex);
} catch (TransformerException ex) {
Logger.getLogger(Networking.class.getName()).log(Level.SEVERE, null, ex);
}
break;
}
/*
out.close();
in.close();
fromSender.close();
brokerSocket.close();
*/
} catch(IOException e) {
// TODOAuto-generated catch block
System.out.println("You got an IOException"+e.getMessage());
e.printStackTrace();
}
}
} |
|
Проект Sender. Класс Main.java
| Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package sender_3;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
/**
* Sender
* @author Iachimov Alex
*/
public class Main {
public static void main(String[]args) throws ParserConfigurationException, TransformerException, SAXException, IOException{
//Создание XML файла.
XMLWorking f = new XMLWorking("C:\\XML\\data.xml");
Networking n = new Networking("127.0.0.1", 8888);
//f.createXML();
String info = f.readXML();
System.out.println(info);
//f.writeXML("C:\\XML\\data2.xml",info);
n.sendMessage(info);
}
} |
|
Далее что бы использовать классы Netwoking и XMLWoking я создал .jar файл и импортировал его в два оставшихся проекта.
Проект Broker. Класс Main.java
| Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package broker_3;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import sender_3.Networking;
import sender_3.XMLWorking;
/**
* Broker
* @author Iachimov Alex
*/
public class Main {
static Networking n = new Networking(8888);
static Networking n2 = new Networking("127.0.0.1",9999);
public static void main(String[]args) throws ParserConfigurationException, TransformerException, IOException{
n.readMessage();
System.out.println("-----------");
n2.sendMessage("Hello World");
}
} |
|
Проект Reciever. Класс Main.java
| Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| /*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Reciever
* @author Iachimov Alex
*/
package reciever_3;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import sender_3.XMLWorking;
import sender_3.Networking;
public class Main {
static Networking n = new Networking(9999);
static XMLWorking f = new XMLWorking();
public static void main(String[]args) throws ParserConfigurationException, TransformerException, IOException{
n.readMessage();
f.writeXML("C:\\XML\\data2.xml", n.readMessage());
}
} |
|
Загвоздка в том,что то отправитель отсылает сообщение брокеру,тот его видит,причём если запустить 100 отправителей ,сё будет нормально работать т.к для каждого запуститься свой поток, но вот от Брокера к получателю у меня не получается отправить сообщение так как я отправлял от отправителя к брокеру. Подскажите пожалуйста как это реализовать. Если у кого то есть небольшой пример реализации через брокера,буду очень признателен.