Commit 256d4d6e authored by Simo Vuorinen's avatar Simo Vuorinen
Browse files

Update VITUN VALMIS PASKA

parent ca1526a1
import java.util.*;
import java.io.*;
import java.net.*;
public class UDPSender extends Thread {
public static void main(String[] args) throws Exception {
//Muodostetaan TCP-Yhteys
Socket tcpsocket = UDPReceiver();
// Muodostetaan oliovirrat
ObjectInputStream inpStream = new ObjectInputStream(tcpsocket.getInputStream());
ObjectOutputStream outpStream = new ObjectOutputStream(tcpsocket.getOutputStream());
//Lue T - asettaa timeoutin.
tcpsocket.setSoTimeout(5000);
int portitLkm = lueT(inpStream, outpStream);
//int[][] lista = new int[2][t];
Socket[] socks = new Socket[portitLkm];
Lokero[] lokerot = new Lokero[portitLkm];
boolean yhdistetty=true;
final ServerSocket[] summaimet=new ServerSocket[portitLkm];
if (portitLkm == -1) {
return;
}
for (int i = 0; i < portitLkm; i++ ) {
/*int p = 5454+i;
outpStream.writeInt(p);
SummausPalvelin[] papi = new SummausPalvelin[t]; */
summaimet[i] = new ServerSocket(0);
lokerot[i] = new Lokero(i);
outpStream.writeInt(summaimet[i].getLocalPort());
outpStream.flush();
}//for
for (int i = 0; i < portitLkm; i++) {
socks[i] = new Socket();
socks[i] = summaimet[i].accept();
new LaskuriTCP(socks[i], lokerot[i]).start();
}//for
int kys= 0;
// KYSYMYKSIIN REAGOINTI
tcpsocket.setSoTimeout(60000); // Jos ei kyselyitä minuutin aikana lopetetaan
while(yhdistetty){
kys = inpStream.readInt();
switch (kys){
case 0: // lopetuspyyntˆ
yhdistetty=false;
break;
case 1: // 1. kysymys: lähetettyjen lukujen kokonaissumma
outpStream.writeInt(kokonaisSumma(lokerot));
outpStream.flush();
break;
case 2: // 2. kysymys: summauspalveluja, jolle välitettyjen lukujen summa on suurin
outpStream.writeInt(suurinSumma(lokerot));
outpStream.flush();
break;
case 3: // 3. kysymys: lähetettyjen lukujen kokonaislukumäärä
outpStream.writeInt(kokonaisLkm(lokerot));
outpStream.flush();
break;
default: // vastaanotettu luku on mikä tahansa muu kuin {0, 1, 2, 3}
outpStream.writeInt(-1);
outpStream.flush();
}
} //while
}
/*public static void lopeta(){
try {
tcpsocket.shutdownInput();
tcpsocket.shutdownOutput();
tcpsocket.close();
System.out.println("pääyhteys kiinni " + tcpsocket.getPort() + " <-> " + tcpsocket.getLocalPort());
} catch (Exception e) {
e.printStackTrace();
}
}/*
/* } catch (SocketTimeoutException e) {
try {
outpStream.writeInt(-1);
outpStream.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
getThreadGroup().interrupt();
lopeta();
} catch (IOException e) { }*/
private static Socket UDPReceiver() throws IOException {
int porttiNo = 5454;
int yrityskerta = 0;
ServerSocket pleb = new ServerSocket(porttiNo);
Socket soketti = new Socket();
while (yrityskerta < 5) {
try {
sendUDP(); // lähetetään UDP paketti asiakkaalle
pleb.setSoTimeout(5000); // soketti odottaa yhteydenottoa 5 sek
soketti = pleb.accept();
pleb.close();
System.out.println("TCP muodostettu");
return soketti;
} catch (SocketException e) {
yrityskerta++;
System.out.println("Ei onnistunut");
}
}
return null;
}
private static void sendUDP() {
try {
InetAddress targetAddress = InetAddress.getLoopbackAddress();
DatagramSocket socket = new DatagramSocket(); //luo socketin vapaaseen porttiin paikallisessa koneessa
byte[] data = Integer.toString(5454).getBytes();
DatagramPacket packet = new DatagramPacket (data, data.length, targetAddress, 3126); //luo datagrampacketin
socket.send(packet); // lähettää paketin
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static int lueT(ObjectInputStream i, ObjectOutputStream o) {
try {
return i.readInt();
} catch (Exception e){
try { o.writeInt(-1); } catch (Exception f) {}
return -1;
}
}
public static int kokonaisSumma(Lokero[] lokerot){
int sum = 0;
for(int i = 0; i<lokerot.length; i++){
sum += lokerot[i].sum();
}
return sum;
}
/**
* Laskee kaikkien laskurisäikeiden lukulistojen alkioiden määrän.
* @return sum Lähetettyjen numeroalkioiden lukumäärä
*/
public static int kokonaisLkm(Lokero[] lokerot){
int sum = 0;
for(int i = 0; i<lokerot.length; i++){
sum += lokerot[i].numbers();
}
return sum;
}
/**
* Palauttaa sen säikeen järjestysluvun, jonka lukulistan summa on suurin.
* @return suurinID Säikeen järjestysluku
*/
public static int suurinSumma(Lokero[] lokerot){
int suurin = lokerot[0].sum();
int suurinID = 1;
for(int i = 0; i<lokerot.length; i++){
if(lokerot[i].sum() > suurin){
suurin = lokerot[i].sum();
suurinID = lokerot[i].getID()+1; // lisätään 1 koska vaaditut järjestysluvut alkavat 1:stä
}
}
return suurinID;
}
public static class LaskuriTCP extends Thread {
private Socket clienttcp;
int testilähetys = -1;
int saatuLuku = 0;
int totalSum = 0;
Lokero lok;
public LaskuriTCP(Socket s, Lokero lok) {
clienttcp = s;
this.lok = lok;
}
/**
* Säikeen run-metodi. Avaa oman TCP-soketin streamit ja kerää
* vastaanotetut luvut lokeroonsa
*/
public void run() {
try {
InputStream iS = clienttcp.getInputStream();
ObjectInputStream oIn = new ObjectInputStream(iS);
clienttcp.setSoTimeout(60000);
while(!isInterrupted()) {
saatuLuku = oIn.readInt();
if (saatuLuku == 0){
break;
}
lok.add(saatuLuku);
}
oIn.close();
clienttcp.close();
} catch (Exception e) {}
System.out.println("Portti "+clienttcp.getLocalPort()+" suljettu");
}
}
public static class Lokero{
// Olion tunnistin (yhdessä testissä pitää palauttaa laskurin järjestysluku)
private final int ID;
// Laskureihin syˆtetyt luvut lisätään olion listaan
ArrayList<Integer> lukulista = new ArrayList<Integer>();
// Konstruktori
public Lokero(int ID){
this.ID = ID;
}
// Palautusmetodit
public int getID(){
return ID;
}
public ArrayList<Integer> getLukulista(){
return lukulista;
}
/**
* Lisää olion lukulistaan kokonaislukualkion
* @param n lisättävä luku
*/
public void add(int n){
lukulista.add(n);
}
/**
* Laskee olion lukulistan alkioiden summan
* @return sum Palautettava summa
*/
public int sum(){
int sum = 0;
synchronized(this){
try{ Thread.sleep(10); } catch (InterruptedException e) {e.printStackTrace();}
for (Integer x : lukulista){
sum += x;
}
notify();
return sum;
}
}
/**
* Laskee lukulistassa olevien alkioiden lukumäärän
* @return number Alkioiden lukumäärä
*/
public int numbers(){
return lukulista.size();
}
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment