黑马程序员技术交流社区
标题:
学网络编程遇到的问题
[打印本页]
作者:
创造命运
时间:
2014-4-20 18:53
标题:
学网络编程遇到的问题
本帖最后由 创造命运 于 2014-4-21 08:12 编辑
/*下面程序是在看完毕老师的视频:第24天-01-网络编程(TCP-上传图片).avi后想到要写的。
本程序实现如下功能:1.由客户端向服务器端上传文件,文件类型可以是任何类型
2.服务器端获取所上传文件的文件名,并以此作为自己的文件名
3.如果在服务器本机的当前目录下已经存在了所上传的文件,则自动另外命名
拓展:多个客户端并发上传。暂时这里没实现该功能,后续完成。*/
import java.net.*;
import java.io.*;
import java.util.*;
//客户端
class TransClient
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.113.1", 10006);
if (args.length != 1)
{
System.out.println("参数不对或者没有输入参数");
System.exit(0);
}
File file = new File(args[0]); //命令行参数就是将要上传的文件名
FileInputStream fis = new FileInputStream(file); //用来读取所传文件中的内容
OutputStream out = s.getOutputStream(); //将文件的内容上传到服务器端
//以下代码将所上传的文件的文件名发送给服务器端
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
String name = file.getName();
pw.println(name);
System.out.println("文件名:"+name);
//判断服务器端是否成功获取文件名
BufferedReader brIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String isOK = brIn.readLine(); //readLine,阻塞式方法,利用该方法阻止程序持续向服务器上传
//如果服务器端获取名字成功,则会返回"OK"
if (isOK.equals("OK"))
{
//以下代码当服务器端获取名字成功,才继续向服务器端上传文件的内容
byte[] buf = new byte[1024];
while (fis.read(buf) != -1)
{
out.write(buf, 0, buf.length);
}
fis.close();
s.close();
}
}
}
//服务端
class TransServer
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(10006);
Socket s = ss.accept();
//System.out.println(s.getInetAddress().getHostName()+".......connect");
InputStream is = s.getInputStream(); //读取Socket流中的数据
FileOutputStream fos = null;
//这里先将客户端所上传的文件的文件名获取到,采用字符流
BufferedReader brIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String name = brIn.readLine();
//String name = Arrays.toString(buf);
System.out.println("从客户端获取到的文件名是:"+name);
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
pw.println("OK"); //成功读取到文件名,告诉客户端OK
//判断客户端上传的文件是否在本机当前目录中内存在,如果存在则另外命名,反之以该文件名作为名字
File file = new File(name);
fos = new FileOutputStream(file);
int count = 0; //定义一个变量,协助为将要存储到硬盘的文件命名
String[] names = name.split(".");
/*while (true)
{
if (file.exists())
{
fos = new FileOutputStream(names[0]+(count++)+"."+names[1]);
}
else
{
fos = new FileOutputStream(name);
break;
}
}*/
//定义一个字节数组,用来存储从Socket读取流中读取出来的内容
byte[] buf = new byte[1024];
while (is.read(buf) != -1)
{
fos.write(buf, 0, buf.length);
}
fos.close();
ss.close();
}
}
/*所遇到的问题:
1.如何在服务器获取客户端所上传文件的文件名。
客户端我利用readLine,阻塞式方法来阻止程序持续向服务器上传。因为如果不阻止一下的话,文件的内容会跟
着文件名一起通过Socket通道发送给服务器。在服务器端读取的时候,文件名与文件内容无法分开。等到服务器
成功获取到客户端的名字后,再告知客户端OK了,客户端这才开始上传数据。
这样弄好麻烦,多定义了四个流。有没有更简单的办法呢?
2.刚开始我全部用在字节流。结果就是这样:比如说我要上传的文件名是1.jpg。那么我在服务器端读取到的名字先是
字节数组,保存在Byte[] bur中,bur里的内容是:{49, 46, 106, 112, 103},我用bur.toString(),打印的是地址
用Arrays.toString(bur),结果是[49, 46, 106, 112, 103],请问怎么把{49, 46, 106, 112, 103}变成"1.jpg"。
即bur--->String???
3.语句:fos = new FileOutputStream(names[0]+(count++)+"."+names[1]);为什么会报数组越界。
1.jpg
(48.93 KB, 下载次数: 15)
下载附件
2014-4-20 18:51 上传
*/
作者:
hhmm665544
时间:
2014-4-21 02:04
if (args.length != 1)
{
System.out.println("参数不对或者没有输入参数");
System.exit(0);
}
需要先判断传入的参数是否为空
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2