因为我将字符串拆分为客户端菜单,我的程序变成了bug,因为swicth在客户端上没有做任何事情,因为它没有做任何事情它不会启动任何方法,这就是为什么当服务器获取输出并启动时下载文件,当它开始写客户端时不会接受它,因为他的菜单没有启动接收功能,任何提示使交换机和服务器工作和同步方法?客户端实现在服务器上传时发送文件,客户端实现在服务器下载时接收文件 所有对cli的输入都是
这是我的conexion服务器
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!");
}
}
}
这是我的客户端类
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();
}
}
}
这是我的服务器
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(); }
}
}
}
这是我的错误
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)
答案 0 :(得分:2)
关闭套接字的输入或输出流将关闭另一个流和套接字,并且您在几个点上执行此操作。
但是此代码存在许多其他问题。
ObjectInputStream
和DataInputStream
。这不起作用。boolean
返回的File.delete()
,你正在捕捉一个不存在的Exception
,不能被抛出,缺少NPE或其他编程错误,同样方法receiveFile()
方法可以超载收到的数据。要在保持连接打开的同时传输多个文件甚至一个文件的正确方法,请参阅this answer。