import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class UpLoadTextServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(6886);
Socket s = ss.accept();
// 读取客户端上传的文件且存储到本地---io
// 获取源和目的:源:InputStream in=s.getInPutSream;
// 目的:FileWriter w=new FileWrite();
// 源: InputStream in = s.getInputStream();
// 目的: FileWriter
// 是否需要其它功能
// FileWriter <-- InputStreamReader(in) <--BufferedReader
// FileWriter<-- PrintWriter(... )
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class UpLoadTextClient {
public static void main(String[] args) throws IOException {
Socket s = new Socket("127.0.0.1", 6886);
// 读取本地文本文件,向服务器端发送---io
// 获得源和目的 文本文件 源:Reader r=new Reader()
// 目的:OutputStream out=s.getOutputSream();
BufferedReader br = new BufferedReader(new FileReader("files\\text.txt"));
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
// 向服务器端上传文件内容(流对拷)
String str = null;
while ((str = br.readLine()) != null) {
pw.println(str);
}
// 发送结束标记
// out.println("over!");//自定义方式
s.shutdownOutput();//用Socket中做的结束标记
//接收服务器端发来的上传成功的提示信息
InputStream in=s.getInputStream();
BufferedReader brr=new BufferedReader(new InputStreamReader(in));
String echo=brr.readLine();
System.out.println(echo);
s.close();
}
}
// 接收数据(流对拷)BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));PrintWriter pw = new PrintWriter(new FileWriter("files\\server.txt"));String str = null;while ((str = br.readLine()) != null) {pw.print(str);pw.flush();}//给客户端一个接收完毕的提示OutputStream out=s.getOutputStream();PrintWriter pw2=new PrintWriter(out,true);pw2.println("上传成功!");s.close();ss.close();}}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class UpLoadTextClient {
public static void main(String[] args) throws IOException {
Socket s = new Socket("127.0.0.1", 6886);
// 读取本地文本文件,向服务器端发送---io
// 获得源和目的 文本文件 源:Reader r=new Reader()
// 目的:OutputStream out=s.getOutputSream();
BufferedReader br = new BufferedReader(new FileReader("files\\text.txt"));
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
// 向服务器端上传文件内容(流对拷)
String str = null;
while ((str = br.readLine()) != null) {
pw.println(str);
}
// 发送结束标记
// out.println("over!");//自定义方式
s.shutdownOutput();//用Socket中做的结束标记
//接收服务器端发来的上传成功的提示信息
InputStream in=s.getInputStream();
BufferedReader brr=new BufferedReader(new InputStreamReader(in));
String echo=brr.readLine();
System.out.println(echo);
s.close();
}
}
下面是上传图片文件。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
//import java.io.PrintStream;
//import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadPhotoServer {
/*支持多用户并发的思想:
* main线程只负责不停地进行响应客户端的连接请求(握手),
* 每成功新建一个连接就另开一个线程去负责跟这个用户通讯。
*/
public static void main(String[] args) {
// 创建serverSocket,指定端口接收数据,这里的端口一定要与用户端发送数据的端口相等
// 等待握手
ServerSocket ss;
try {
ss = new ServerSocket(8668);
while(true){//无限循环,若握手成功,则另开一个线程
Socket s = ss.accept();// 阻塞方法
// 程序能运行到这里,说明握手成功,否则等待抛异常
new Thread(new UpLoadServerThread(s)).start();//开线程接待
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class UpLoadServerThread implements Runnable {
private Socket s=null;
public UpLoadServerThread(Socket s) {
this.s = s;
}
@Override
public void run() {
try {
//先获取对方的IP
String ip=s.getInetAddress().getHostAddress();
// 读取客户端上传的图片文件且存储到本地---io
/*
* 获取源和目的 源:inputstream in= s.getInputStream();
* 目的:FileOutputStream out=new FileOutputStream(file);
*/
/*
* 是否需要其它功能 FileOutputSream<--BufferedOutputSream
* )
*/
//文件存放位置处理
File dir=new File("file");
if(!dir.exists()){
dir.mkdirs();
}
//先接收传送过来的文件名
InputStream in = s.getInputStream();
BufferedInputStream bis = new BufferedInputStream(in);
//这里要注意,读取内容的大小要与上传时定义的文件头大小要相等。
byte bb[]=new byte[1024];
bis.read(bb);
int i=0;
for(;i<bb.length;i++){
if(bb[i]==10){
break;
}
}
//获取文件名
String imagFileName=new String(bb,0,i,"UTF-8");
//---文件名设计: IP(1).jpg, IP(2).jpg ....指定传送过来的文件名
//文件对象处理(最主要是考虑文件名的生成)
int count=1;
File file=new File(dir,(count++)+imagFileName);
System.out.println(ip);
while(file.exists()){
file=new File(dir,(count++)+imagFileName);
}
file.createNewFile();
// 接收数据(流对拷)
OutputStream out = new FileOutputStream(file);
//PrintStream ps = new PrintStream(out);
BufferedOutputStream bos=new BufferedOutputStream(out);
byte b[] = new byte[1024];
int len = 0;
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
bos.flush();
}
// 给客户端一个接收完毕的提示
OutputStream out2 = s.getOutputStream();
//PrintWriter pw2 = new PrintWriter(out2, true);
//pw2.println("上传成功!");
out2.write("文件上传成功!".getBytes());
s.close();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
//import java.io.PrintStream;
import java.net.Socket;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
/**
*
* @author <a href=875183520@qq.com/>张涛森 把一个图片文件发送到服务端并读取回馈信息。
* 要求判断文件是否存在及格式是否为jpg或gif并要求文件小于2M version 1.0 2018-5-11 上午11:09:05
*/
public class UpLoadPhotoClient {
public static void main(String[] args) throws IOException{
// 建立socket连接(ip+port)
Socket s = new Socket("127.0.0.1", 8668);
// 能到这里 说明 已经建立连接,可以进行图片上传
/*
* 要读取本地图片文件,先看符不符合要求 1.文件是否存在 2.判断后缀名是那种形式(.jpg或者.gif) 3.文件大小不超过2M
*/
JFileChooser jfc = new JFileChooser();
int sel = jfc.showOpenDialog(null);
File imageFile = null;
if (sel == JFileChooser.APPROVE_OPTION) {
imageFile = jfc.getSelectedFile();
}
if (imageFile == null) {
JOptionPane.showMessageDialog(null, "选择文件不能为空!");
s.close();
return;
}
// 1.如果文件不存在,就结束
if (!imageFile.exists()) {
JOptionPane.showMessageDialog(null, "文件不存在!");
s.close();
return;
}
// 2.判断后缀名是那种形式(.jpg或者.gif)
// 能到这里说明文件存在,接下来进行格式校验
// 如果不是 jpg或gif 就结束
if (!(imageFile.getName().endsWith(".jpg") || (imageFile.getName()
.endsWith("gif")))) {
JOptionPane.showMessageDialog(null, "文件格式格式只能为jpg或gif格式!");
s.close();
return;
}
// 能到这里说明文件名符合要求,进行最后的校验
// 3.文件大小不超过2M,
if (imageFile.length() > 4* 1024 * 1024) {
JOptionPane.showMessageDialog(null, "出错啦,文件大小不能超过4M!");
s.close();
return;
}
// 程序能到这里说明可以进行上传了
// 向服务器端发送---io
// 因为文件是 图片 类型 为了不失真 采用字节流
//PrintStream ps = new PrintStream(s.getOutputStream(), true);
BufferedOutputStream bs=new BufferedOutputStream(s.getOutputStream());
//相当于协议,先把文件名发送到另一端
byte fileName[]=new byte[1024];
byte buf[]=(imageFile.getName()+"\n").getBytes();
System.arraycopy(buf,0,fileName,0,buf.length);
bs.write(fileName);
//读取图片数据
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(imageFile));
// 向服务器端上传文件内容,进行流对拷
byte b[] = new byte[1024];
int len = 0;
while ((len = bis.read(b)) != -1) {
bs.write(b, 0, len);
bs.flush();//※※注意: 所有字符流都要刷缓存, 字节流的缓存流也要刷缓存
}
// 关闭输入流
bis.close();
// 用Socket中做的结束标记
s.shutdownOutput();//发送结束标记(表示输出的结束标记)
//接收服务器的反馈信息
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));
String echo=br.readLine();
System.out.println(echo);
//关闭socket
s.close();
}
}