问题描述
|
我想创建小型客户端-服务器TCP文件传输程序。我有一件事有问题。当我从客户端向服务器发送文件时,例如txt文件:omg.txt,我希望服务器读取传入的文件名。
因此-客户端发送omg.txt,服务器说“收到的新文件:omg.txt”。我尝试使用
BufferedReader
(服务器)和DataOutputStream
(客户端,因为您必须写文件名才能发送),但是它没有用。
编辑:
客户:
Socket sock = new Socket(\"localhost\",13267);
System.out.println(\"Wait...\");
Scanner input = new Scanner(system.in);
while(true){
// wysylanie
System.out.println(\"Filename\");
String p = input.nextLine();
File myFile = new File (p);
boolean exists = (new File(p)).exists();
if (exists) {
byte [] mybytearray = new byte [(int)myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
bufferedoutputstream out = new bufferedoutputstream(sock.getoutputStream());
bis.read(mybytearray,mybytearray.length);
OutputStream os = sock.getoutputStream();
System.out.println(\"Wait...\");
os.write(mybytearray,mybytearray.length);
os.flush();
System.out.println(\"Done\");
sock.close();
}
服务器:
int filesize=6022386;
int bytesRead;
int current = 0;
ServerSocket servsock = new ServerSocket(13267);
Scanner input = new Scanner(system.in);
while (true) {
System.out.println(\"Wait...\");
Socket sock = servsock.accept();
System.out.println(\"OK : \" + sock);
// odbior pliku
byte [] mybytearray = new byte [filesize];
InputStream is = sock.getInputStream();
bytesRead = is.read(mybytearray,mybytearray.length);
current = bytesRead;
do {
bytesRead =
is.read(mybytearray,current,(mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
System.out.println(\"New filename\");
String p = input.nextLine();
File plik = new File(p);
FileOutputStream fos = new FileOutputStream(plik);
bufferedoutputstream bos = new bufferedoutputstream(fos);
bos.write(mybytearray,current);
bos.flush();
System.out.println(\"File saved\");
bos.close();
sock.close();
我试图做这样的事情:
客户插件:
DataOutputStream outToServer = new DataOutputStream(sock.getoutputStream());
sentence = input.nextLine();
outToServer.writeBytes(sentence);
服务器插件:
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(sock.getInputStream()));
clientSentence = inFromClient.readLine();
System.out.println(clientSentence);
...但很幸运,我一直在为客户提供“等待...”
解决方法
TCP只是传输原始数据。如果要发送带有文件名的文件,则可能需要使用更高级别的协议,例如FTP或TFTP。
如果您确实要使用纯TCP,则需要以某种方式对消息中的文件名进行编码。例如,您可以将文件名作为消息的第一行发送,然后让另一端将消息的其余部分转换为具有该名称的文件。
这可能对您有帮助:http://www.adp-gmbh.ch/blog/2004/november/15.html