Reputation: 45
since im spliting the string to the client menu, my programs turns to bug because the swicth doesnt do anything on the client and since it doesnt do anything it doesnt start any method, and thats why when server gets the output and start the download file, when it starts writing the client doesnt acept it, because his menu didnt started the receive function, any tip to make the switch and the server work and synchronized methods? client realices send file while server does upload, and client realices receivefile when server does download all cuz of the input to the cli
this is my conexion Server
package eagz.org;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ConexionServer1 extends Thread{
private static ServerSocket ss;
private static Socket s = null;
public static String path = "C:\\Users\\Eduardo\\Desktop\\Eduardo\\Uru\\Clases Programacion\\POO\\CLI\\server\\";
static Scanner input = new Scanner (System.in);
private static BufferedReader in = null;
ConexionServer1(Socket s){
this.s = s; }
public void run(){
try{
menu(); } //line 33
finally{
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } }
public static void menu() {
try {
while(true){
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); // line 47
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
String msg = (String)ois.readObject();
System.out.println(msg);
String[] cmds = msg.split(" ");
/* in = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String clientSelection = in.readLine();
String[] cmds = clientSelection.split(" ");
String[] cmds = clientSelection.split("");*/
switch(cmds[0]){
case "create": ;
File f = new File(cmds[1]);
if(!f.exists()){
create(cmds[1]);
oos.writeObject(">> File Created"); }
else{
create(cmds[1]);
oos.writeObject(">> File not created"); }
break;
case "delete":
File f1 = new File(cmds[1]);
delete(cmds[1]);
if(!f1.exists()){
oos.writeObject(" File Deleted "); }
else{
oos.writeObject(" File not found"); }
break;
case "download":
download(cmds[1]);
oos.writeObject("Sucess");
break;
case "upload":
upload(cmds[1]);
oos.writeObject("Sucessfull");
break;
default:
System.out.println("Undefined Operation");
oos.writeObject("Undefined Operation");
break;
}//case
oos.close();
ois.close();
}}
catch (IOException | ClassNotFoundException e) { e.printStackTrace(); }
}
public static void create (String filename){
File f = new File(path + filename);
try{if(!f.exists()){
f.createNewFile();
System.out.println(">> File Created");
}
else {
System.err.println(">> File Already Exists"); }
}
catch(Exception e){e.printStackTrace();}
}//create
public static void delete (String filename){
File f = new File(path + filename);
try{if(f.exists()){
f.delete();
System.out.println(">>File Deleted"); }
else{
System.err.println(">>Error, File doesnt exist's"); }
}
catch(Exception e){e.printStackTrace();}
}
public static void upload (String filename){
File f = new File(path + filename);
try{
DataInputStream clientData = new DataInputStream(s.getInputStream());
// String fileName = clientData.readUTF();
OutputStream os = new FileOutputStream(("received from client -> " + f));
long size = clientData.readLong();
byte[] buffer = new byte[1024];
int i = clientData.read(buffer,0,(int) size);
while(size > 0 && (i) > 0){
os.write(buffer, 0, i);
size -= i;
}
os.flush();
clientData.close();
System.out.println("File "+filename+" received from client.");
} catch (IOException ex) {
System.err.println("Client error. Connection closed.");}
}
public static void download (String filename){
try {
File myFile = new File(path + filename);
byte[] mybytearray = new byte[(int) myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
dis.readFully(mybytearray, 0, mybytearray.length);
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(myFile.getName());
dos.writeLong(mybytearray.length);
dos.write(mybytearray, 0, mybytearray.length);
dos.flush();
System.out.println("File "+ filename +" sent to client.");
} catch (Exception e) {
System.err.println("File does not exist!");
}
}
}
this is my client class
package eagz.org;
public class Cliente {
public static String path = "C:\\Users\\Eduardo\\Desktop\\Eduardo\\Uru\\Clases Programacion\\POO\\CLI\\cliente";
private static Socket s;
private static String fileName;
private static BufferedReader stdin;
private static PrintStream os;
static int PORT = 9000;
static String IP = "localhost"; //use your ip
static Scanner input = new Scanner (System.in);
public static void main(String[] args) throws IOException {
try {
s = new Socket(IP ,PORT);
stdin = new BufferedReader(new InputStreamReader(System.in));
System.err.println("-- Client --");
System.out.println("Connecting to Server ->" + IP + "/" + PORT);
System.out.println("Commands: "+" -> Create "+" -> Delete "+" -> Download "+" -> Upload");
System.out.println("C:>");
String inp = input.nextLine();
String [] cmds = inp.split("");
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(inp);
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
// System.out.println("From Server : " + servermsg);
switch (cmds[0]) {
case "upload":
// os.println(cmds);
//oos.writeObject(inp);
sendFile(cmds[1]);
break;
case "download":
//System.err.print("Enter file name: ");
fileName = cmds[1];
oos.writeObject(cmds[0] + fileName);
receiveFile(fileName);
break;
}
//String servermsg = (String) ois.readObject();
System.out.println("From Server : " );
} catch (Exception e) {
e.printStackTrace();
}
}
public synchronized static void sendFile(String fileName) {
try {
File myFile = new File(path + fileName);
byte[] mybytearray = new byte[(int) myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
dis.readFully(mybytearray, 0, mybytearray.length);
OutputStream os = s.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(myFile.getName());
dos.writeLong(mybytearray.length);
dos.write(mybytearray, 0, mybytearray.length);
dos.flush();
System.out.println("File "+fileName+" sent to Server.");
} catch (Exception e) {
System.err.println("File does not exist!");
}
}
public synchronized static void receiveFile(String fileName) {
try {
File f = new File(path + fileName);
InputStream is = s.getInputStream();
DataInputStream clientData = new DataInputStream(is);
fileName = clientData.readUTF();
OutputStream os = new FileOutputStream(("received from server -> " + f));
long size = clientData.readLong();
byte[] buffer = new byte[1024];
int i = clientData.read(buffer,0,(int) size);
while (size > 0 && (i) != -1) {
os.write(buffer, 0, i);
size -= i;
}
os.close();
clientData.close();
System.out.println("File "+fileName+" received from Server.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
and this is my server
package eagz.org;
public class Server extends Thread {
public static final int PORT = 9000;
public static ServerSocket ss = null;
public static Socket s = null;
public static void main(String[] args) {
try {
ss = new ServerSocket(PORT);
System.err.println("- - Server - -");
while(true){
s = ss.accept();
System.out.println("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -");
System.out.println("NEW CONNECTION WORKING ON ADDRESS -> " + s.getInetAddress().getHostName());
Thread conect = new ConexionServer1(s);
conect.start();
}
} catch (IOException e) {
System.err.println("Port already in use.");
e.printStackTrace();}
finally{
try {
s.close();
ss.close();
} catch (Exception e) { e.printStackTrace(); }
}
}
}
and this is my error
NEW CONNECTION WORKING ON ADDRESS -> Eduardo
download cesar.txt
java.net.SocketException: Socket is closed
File cesar.txt sent to client.
at java.net.Socket.getOutputStream(Socket.java:943)
at eagz.org.ConexionServer1.menu(ConexionServer1.java:47)
at eagz.org.ConexionServer1.run(ConexionServer1.java:33)
Upvotes: 0
Views: 111
Reputation: 310915
Closing the input or output stream of a socket closes the other stream and the socket, and you are doing this at several points.
However there are numerous other problems with this code.
ObjectInputStream
and DataInputStream
on the same socket. This will not work.boolean
returned by File.delete()
, and you are catching a non-existent Exception
that cannot be thrown, short of an NPE or other programming bug, in the same method.receiveFile()
method can over-run the received data. For a correct way to transfer multiple files, or even one file while keeping the connection open, see this answer.Upvotes: 2