壁画不多说
客户端:
import java.io.*;
import java.net.Socket;
public class UploadPicClient {
public static void main(String[]args) throws IOException {
//1,创建socket
Socket s = new Socket("192.168.43.5",10007);//我的Ip地址是192.168.43.5,自己传自己
//2,读取源图片。
File picFile = new File("") ;
FileInputStream fis = new FileInputStream(picFile);
//3,目的是socket输出流。
OutputStream out = s. getOutputStream();
byte[] buf = new byte [1024];
int len = 0;
while((len=fis. read (buf)) !=-1) {
out. write (buf, 0, len) ;
//告诉服务器端图片数据发送完毕,不要等着读了。
s. shutdownOutput() ;
/**
* 单向关闭流,防止服务端无线循环读取数据。(结束标记)
*/
//读取.上传成功字样。
InputStream in = s.getInputStream();
byte[] bufIn = new byte [1024];
int lenIn = in. read (bufIn) ;
System. out. println (new String (bufIn, 0, lenIn));
//关闭。
fis.close() ;
s.close() ;
}
}
}
服务端:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadPicServer {
public static void main(String[] args) throws IOException {
//创建服务器
ServerSocket serverSocket = new ServerSocket(10007);
while (true) {//循环,可多次上传图片
Socket socket = serverSocket.accept();//阻塞状态,等待下一个socket
InputStream fis = socket.getInputStream();//getInputstream();返回的是InoutStream的对象所以要用超类
String s=socket.getInetAddress().getHostAddress();
System.out.println(s+"......connect");
File dir=new File("e:\\UploadPics");
if(!dir.exists())
{
dir.mkdir();
}
int counter=1;
File fIle = new File(dir,s+"("+counter+")"+".ipg");//为了解决一个人上传多张照片重命名的问题,我们使用iP地址以及计数器来编号
while(fIle.exists())//第一次创建文件,但是没有写入,所以为假,不执行。
{
counter++;
fIle =new File(dir,s+"("+counter+")"+".ipg");
}
FileOutputStream fileOutputStream = new FileOutputStream(fIle);//创建流
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fis.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);//写入数据,使文件不为空
}
//给客户回消息
OutputStream out = socket.getOutputStream();
out.write("上传成功".getBytes());
//关闭资源
socket.close();//关闭客户端
fileOutputStream.close();//关闭文件输出流
}
}
}
/**
* 问题就来了,虽然解决的一个人传多张图片命名的问题,但是,如果张三连接着服务器正在传输图片的时候,李四也想传,连接了服务器,但是他不能传
* 因为,服务器的主线程正在传张三的图片
* 所以,要考虑使用并发访问,也就是多线程技术。
*/
服务端改进,满足多个用户同时进行传输:
public class UploadPicServer {
public static void main(String[] args) throws IOException {
//创建服务器
ServerSocket serverSocket = new ServerSocket(10007);
while (true) {//循环,可多次上传图片
Socket socket = serverSocket.accept();//阻塞状态,等待下一个socket
new Thread(new UploadPic(socket)).start();
}
}
}
import java.io.*;
import java.net.Socket;
public class UploadPic implements Runnable {
private Socket socket;
public UploadPic(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream fis = socket.getInputStream();//getInputstream();返回的是InoutStream的对象所以要用超类
String s = socket.getInetAddress().getHostAddress();
System.out.println(s + "......connect");
File dir = new File("e:\\UploadPics");
if (!dir.exists()) {
dir.mkdir();
}
int counter = 1;
File fIle = new File(dir, s + "(" + counter + ")" + ".ipg");//为了解决一个人上传多张照片重命名的问题,我们使用iP地址以及计数器来编号
while (fIle.exists())//第一次创建文件,但是没有写入,所以为假,不执行。
{
counter++;
fIle = new File(dir, s + "(" + counter + ")" + ".ipg");
}
FileOutputStream fileOutputStream = new FileOutputStream(fIle);//创建流
byte[] bytes = new byte[1024];
int len = 0;
while ((len = fis.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);//写入数据,使文件不为空
}
//给客户回消息
OutputStream out = socket.getOutputStream();
out.write("上传成功".getBytes());
//关闭资源
socket.close();//关闭客户端
fileOutputStream.close();//关闭文件输出流
}catch (IOException i)
{
}
}
}