スクリーンショットを送信します左側のウィンドウ(サーバー)は、この行の正しい出力を実行するのではなく、「ヌル」を出力することである:System.out.println("File " + filename + " downloaded (" + current + " bytes read)");
は、ファイル(マルチスレッドのJavaソケット)上のスクリーンショットでプログラムを実行している(右、左、クライアント上のサーバー)</p> <p><a href="https://i.stack.imgur.com/eGbPK.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/eGbPK.png" alt="enter image description here"></a></p> <p>問題の
次のようにファイル転送通信の流れが起こる:
サーバのユーザは "f"を入力し、サーバはEnterを押し、サーバはファイル名(この場合はtest.txt
)を入力し、サーバは入力を、クライアントはファイル名を、クライアントはファイルをサーバに、サーバはファイルを、サーバはプリントラインを出力する。
私の質問は次のとおりです。次のコードを変更して、その印刷行の正しい出力を実行できるようにしますか?
ここでは、サーバー側ここ
public void SendFileName() throws FileNotFoundException
{
try
{
//Send the message to the client
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
//creating message to send from standard input
String newmessage = "";
// input the message from standard input
BufferedReader input= new BufferedReader(new InputStreamReader(System.in));
String line = "";
System.out.println("What file do you want?");
line= input.readLine();
newmessage += line + " ";
String filename = newmessage;
bw.write("filenameistotheright->` " + filename);
bw.newLine();
bw.flush();
int maxsize = 9999;
int bytesRead;
int current = 0;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
Socket sock = null;
// receive file
byte [] mybytearray = new byte [maxsize];
InputStream is = sock.getInputStream();
fos = new FileOutputStream(filename);
bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
while(bytesRead > -1)
{
bytesRead = is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0)
{
current += bytesRead;
}
}
bos.write(mybytearray, 0 , current);
bos.flush();
System.out.println("File " + filename + " downloaded (" + current + " bytes read)");
StandardInput();
// runClientRead(clientArgs);
}
catch (IOException e)
{
e.printStackTrace();
}
}
上で、それを受けてのコードは、クライアント側
import java.io.*;
import java.net.Socket;
public class ClientReceive extends Thread
{
Socket clientSocket;
boolean m_bRunThread = true;
boolean ServerOn = true;
int gotPortNumber = 0;
public ClientReceive(Socket s) throws FileNotFoundException
{
//super();
clientSocket = s;
}
public void run()
{
while(true)
{
try
{
BufferedReader readFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String fromServer = readFromServer.readLine();
if(fromServer.contains("filenameistotheright->` ") == true)
{
String[] parts = fromServer.split(" ");
String nonsense = parts[0];
String filename = parts[1];
System.out.println("Requested filename is: " + filename);
//sending file
FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null;
File myFile = new File(filename);
byte [] mybytearray = new byte [(int)myFile.length()];
fis = new FileInputStream(myFile);
bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
os = clientSocket.getOutputStream();
System.out.println("Sending " + filename + "(" + mybytearray.length + " bytes)");
os.write(mybytearray,0,mybytearray.length);
os.flush();
}
else
{
String a = fromServer;
int i;
for(i = 0; i < a.length(); i++)
{
char c = a.charAt(i);
if('0' <= c && c <= '9')
{
break;
}
}
String alphaPart = a.substring(0, i);
String numberPart = a.substring(i);
System.out.println("Recieved from server: " + alphaPart +"\n");
if(fromServer.equals(null))
{
System.exit(0);
}
}
if(fromServer.equals(null))
{
System.exit(0);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
}
}
}
}
TL上でそれを送信するコードです; DR:あなたが解決策を知っている場合この行では、以下のコードを読み、下にスクロールして答えます。合計で8つのクラスがあります。
メイン関数ファイル:
import java.io.*;
public class Main
{
public static void main(String[] args) throws IOException, FileNotFoundException
{
Client client1 = null;
Server server1 = null;
for (int i = 0; i < args.length; i++)
{
if (args.length > 2)
{
client1 = new Client(args);
client1.clientRun2(args);
}
else if (args.length == 2)
{
server1 = new Server(args);
server1.serverRun2(args);
}
i=args.length + 20;
}
}
}
Serverファイル:
import java.io.*;
import java.net.*;
import java.util.*;
import javax.imageio.IIOException;
public class Server
{
private String[] serverArgs;
public Socket socket;
public Socket fileSocket;
public boolean keepRunning = true;
public int ConnectOnce = 0;
public String option = "";
public boolean isConnected = false;
public Server(String[] args) throws IOException
{
// set the instance variable
this.serverArgs = args;
if(ConnectOnce == 0)
{
int port_number1 = Integer.valueOf(serverArgs[1]);
ServerSocket serverSocket = new ServerSocket(port_number1);
socket = serverSocket.accept();
ConnectOnce = 4;
isConnected = true;
}
}
public String[] serverRun2(String[] args) throws IOException
{
serverArgs = args;
serverArgs = Arrays.copyOf(args, args.length);
serverSend.start();
return serverArgs;
}
Thread serverSend = new Thread()
{
public void run()
{
OutputOptions();
while(isConnected)
{
try
{
ServerRecieve serverThread = new ServerRecieve(socket);
serverThread.start();
// input the message from standard input
BufferedReader input2= new BufferedReader(new InputStreamReader(System.in));
option = input2.readLine();
if(option.equals("m") || option.equals("M"))
{
StandardOutput();
}
if(option.equals("f") || option.equals("F"))
{
SendFileName();
}
if(option.equals("x") || option.equals("X"))
{
System.exit(0);
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}
};
public void StandardOutput()
{
try
{
//Send the message to the client
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
//creating message to send from standard input
String newmessage = "";
try
{
System.out.println("Enter your message: ");
// input the message from standard input
BufferedReader input2= new BufferedReader(new InputStreamReader(System.in));
String line = "";
line= input2.readLine();
newmessage += line + " ";
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
String sendMessage = newmessage;
bw.write(sendMessage + "\n");
bw.newLine();
bw.flush();
System.out.println("Message sent to client: "+sendMessage);
StandardInput();
//run();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
}
}
public void SendFileName() throws FileNotFoundException
{
try
{
//Send the message to the client
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
//creating message to send from standard input
String newmessage = "";
// input the message from standard input
BufferedReader input= new BufferedReader(new InputStreamReader(System.in));
String line = "";
System.out.println("What file do you want?");
line= input.readLine();
newmessage += line + " ";
String filename = newmessage;
bw.write("filenameistotheright->` " + filename);
bw.newLine();
bw.flush();
int maxsize = 9999;
int bytesRead;
int current = 0;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
Socket sock = null;
// receive file
byte [] mybytearray = new byte [maxsize];
InputStream is = sock.getInputStream();
fos = new FileOutputStream(filename);
bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
while(bytesRead > -1)
{
bytesRead = is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0)
{
current += bytesRead;
}
}
bos.write(mybytearray, 0 , current);
bos.flush();
System.out.println("File " + filename + " downloaded (" + current + " bytes read)");
StandardInput();
// runClientRead(clientArgs);
}
catch (IOException e)
{
e.printStackTrace();
}
}
void FileTransferSend()
{
//connect to the filetransfer
try
{
System.out.println("Which file do you want? ");
Scanner scanner = new Scanner(System.in);
String filename = scanner.nextLine();
FileInputStream fis = new FileInputStream(new File(filename));
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(fileSocket.getOutputStream()));
int element;
while((element = fis.read()) !=1)
{
dos.write(element);
}
byte[] byteBuffer = new byte[1024]; // buffer
while(fis.read(byteBuffer)!= -1)
{
dos.write(byteBuffer);
}
OutputOptions();
// dos.close();
// fis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
}
}
void OutputOptions()
{
System.out.println("Enter an option ('m', 'f', 'x'): ");
System.out.println("(M)essage (send)");
System.out.println("(F)ile (request) ");
System.out.println("e(X)it ");
}
public void StandardInput()
{
OutputOptions();
while(true)
{
try
{
// input the message from standard input
BufferedReader input2= new BufferedReader(new InputStreamReader(System.in));
String line2 = "";
option= input2.readLine();
if(option.equals("m") || option.equals("M"))
{
StandardOutput();
}
if(option.equals("f") || option.equals("F"))
{
SendFileName();
}
if(option.equals("x") || option.equals("X"))
{
System.exit(0);
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
finally
{
}
}
}
}
サーバーRecievingスレッド1:
import java.net.ServerSocket;
import java.net.Socket;
import java.io.*;
public class ServerRecieve extends Thread
{
int filePortNumber = 0;
Socket servSocket;
Socket fileSocket;
boolean m_bRunThread = true;
boolean ServerOn = true;
int gotPortNumber = 0;
int once = 0;
String fileNameGlobal = "";
public ServerRecieve(Socket s) throws FileNotFoundException
{
super();
this.servSocket = s;
}
public void run()
{
while(true)
{
try
{
BufferedReader readFromClient = new BufferedReader(new InputStreamReader(servSocket.getInputStream()));
String fromClient = readFromClient.readLine();
if(fromClient.contains("filenameistotheright->` ") == true)
{
String[] parts = fromClient.split(" ");
final String filename = parts[1];
System.out.println("Requested filename is: " + filename);
fileNameGlobal = filename;
//Sending the file
FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null;
File myFile = new File(filename);
byte [] mybytearray = new byte [(int)myFile.length()];
fis = new FileInputStream(myFile);
bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
os = servSocket.getOutputStream();
System.out.println("Sending " + filename + "(" + mybytearray.length + " bytes)");
os.write(mybytearray,0,mybytearray.length);
os.flush();
}
else
{
String a = fromClient;
int i;
for(i = 0; i < a.length(); i++)
{
char c = a.charAt(i);
if('0' <= c && c <= '9')
{
break;
}
}
String alphaPart = a.substring(0, i);
String numberPart = a.substring(i);
System.out.println("Recieved from client: " + alphaPart +"\n");
if(gotPortNumber == 0)
{
String[] parts1 = fromClient.split(" ");
String nonsense1 = parts1[0];
String filename1 = parts1[1];
System.out.println("File transfer port found: " + numberPart + "\n");
gotPortNumber = 3;
filePortNumber = Integer.parseInt(numberPart);
int p = 0;
p = strToInt(numberPart);
System.out.println(filename1);
//starting the recieving thread
if(once == 0)
{
String[] parts12 = fromClient.split(" ");
String nonsense12 = parts12[0];
String filename31 = parts12[1];
//System.out.println("name:" + filename31);
String address = "localhost";
// fileSocket = new Socket(address, p);
//ServerSocket serverSocket1 = new ServerSocket(p);
if((filename31.equals(null) == true) && (!filename31.equals("")==true))
{
ServerFile getServerFile = new ServerFile(servSocket, p, filename31);
getServerFile.start();
}
once = 4;
}
once = 4;
}
gotPortNumber = 3;
if(fromClient.equals(null))
{
System.exit(0);
}
OutputOptions();
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
}
}
}
void OutputOptions()
{
System.out.println("Enter an option ('m', 'f', 'x'): ");
System.out.println("(M)essage (send)");
System.out.println("(F)ile (request) ");
System.out.println("e(X)it ");
}
public int strToInt(String str)
{
int i = 0;
int num = 0;
boolean isNeg = false;
//Check for negative sign; if it's there, set the isNeg flag
if (str.charAt(0) == '-') {
isNeg = true;
i = 1;
}
//Process each character of the string;
while(i < str.length()) {
num *= 10;
num += str.charAt(i++) - '0'; //Minus the ASCII code of '0' to get the value of the charAt(i++).
}
if (isNeg)
num = -num;
return num;
}
}
サーバーRecievingスレッド2:フルコンテキストで
import java.net.Socket;
import java.io.*;
import java.util.*;
public class ServerFile extends Thread
{
public Socket servingSocket = null;
public int FilePort = 0;
public String otherName = "";
public ServerFile(Socket ok, int port, String FileName) throws FileNotFoundException
{
this.FilePort = port;
this.servingSocket = ok;
this.otherName = FileName;
}
public void run()
{
while(true)
{
try
{
int maxsize = 999999;
byte[] buffer = new byte[maxsize];
//servingSocket = new Socket("localhost", FilePort);
InputStream is = servingSocket.getInputStream();
File test = new File(otherName);
test.createNewFile();
FileOutputStream fos = new FileOutputStream(test);
BufferedOutputStream out = new BufferedOutputStream(fos);
int byteread = is.read(buffer, 0, buffer.length);
int current = byteread;
buffer = new byte[16384];
while ((byteread = is.read(buffer, 0, buffer.length)) != -1)
{
out.write(buffer, 0, byteread);
}
out.flush();
//socket.close();
// fos.close();
// is.close();
} catch (IOException e)
{
e.printStackTrace();
}
finally
{
}
}
}
}
クライアントコード: https://www.dropbox.com/s/x2pjlw2wcgn8lhd/newcode.zip?dl=0
ここには多すぎる問題があります。それをすべて投げ捨て、重複した質問に対する私の答えにコードを使用してください。 – EJP