java Socket通信及文件操作
编译软件:Eclipse
一、客户端
package com;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class socketclient {
private static FileInputStream fis;
private static DataOutputStream dos;
//生成文件路径
private static String path = "D:/data/";
//文件路径+名称
private static String filenameTemp;
public static void main(String[] args) {
try {
/** 创建Socket*/
// 创建一个流套接字并将其连接到指定 IP 地址的指定端口号(本处是本机)
Socket client = new Socket("xxx.xxx.xxx.xxx", 12345);
// 60s超时
client.setSoTimeout(60000);
/** 发送客户端准备传输的信息 */
// 由Socket对象得到输出流,并构造PrintWriter对象
PrintWriter printWriter = new PrintWriter(client.getOutputStream(), true);
// 将输入读入的字符串输出到Server
BufferedReader sysBuff = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入文件名: ");
String namefile =sysBuff.readLine();
printWriter.println(namefile);
// 刷新输出流,使Server马上收到该字符串
printWriter.flush();
/* 用于获取服务端传输来的信息 */
/*
//由Socket对象得到输入流,并构造相应的BufferedReader对象
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
//读入一字符串
String Serverdata = bufferedReader.readLine();
System.out.println("服务器回传数据 : " + Serverdata);
*/
//创建文件
String filecontent="帅哥!";//文件内容
/*
//从控制台输入所要文本创建的内容
String filecontent =sysBuff.readLine();
*/
filenameTemp = path+namefile+".txt";//文件路径+名称+文件类型
File file =new File(filenameTemp);
try {
//如果文件不存在,则创建新的文件
if(!file.exists()){
file.createNewFile();
System.out.println("File created successfully");
//创建文件成功后,写入内容到文件里
FileWriter wr= new FileWriter(file);
wr.write(filecontent);
wr.flush();
wr.close();
System.out.println("File written successfully");
}else {
System.out.println("File already exists");
}
} catch (Exception e) {
e.printStackTrace();
}
//向服务端传送文件
//File file = new File("D:/data/lkm.txt");//直接传输文件夹里的文件
fis = new FileInputStream(file);
dos = new DataOutputStream(client.getOutputStream());
//文件名和长度
dos.writeUTF(file.getName());
dos.flush();
dos.writeLong(file.length());
dos.flush();
//传输文件
byte[] sendBytes = new byte[1024];
int length = 0;
while((length = fis.read(sendBytes, 0, sendBytes.length)) > 0){
dos.write(sendBytes, 0, length);
System.out.println("File send sucess");
dos.flush();
}
/** 关闭Socket*/
fis.close();
dos.close();
printWriter.close();
client.close();
} catch (Exception e) {
System.out.println("Exception:" + e);
}
}
}
二、服务器
package com;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class socketserver {
private static DataInputStream dis;
private static FileOutputStream fos;
public static void main(String[] args) throws IOException {
//1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
@SuppressWarnings("resource")
ServerSocket serverSocket = new ServerSocket(12345);
InetAddress address = InetAddress.getLocalHost();
String ip = address.getHostAddress();
Socket client = null;
//2.调用accept()等待客户端连接
System.out.println("~~~服务端已就绪,等待客户端接入~,服务端ip地址: " + ip);
client = serverSocket.accept();
//3.连接后获取输入流,读取客户端信息
InputStream is=null;
InputStreamReader isr=null;
BufferedReader br=null;
is = client.getInputStream(); //获取输入流
isr = new InputStreamReader(is,"UTF-8");
br = new BufferedReader(isr);
String info=null;
while((info=br.readLine())!=null){//循环读取客户端的信息
System.out.println("接受数据:"+info);
//接受客服端发来的文件
dis = new DataInputStream(client.getInputStream());
//文件名和长度
String fileName = dis.readUTF();
long fileLength = dis.readLong();
//文件存储路径
fos = new FileOutputStream(new File("D:/data/lk/" + fileName));
byte[] sendBytes = new byte[1024];
int transLen = 0;
System.out.println("----开始接收文件<" + fileName + ">,文件大小为<" + fileLength + "Byte>----");
while(true){
int read = 0;
read = dis.read(sendBytes);
if(read == -1)
break;
transLen += read;
System.out.println("接收文件进度" + 100 * transLen/fileLength + "%...");
fos.write(sendBytes, 0, read);
fos.flush();
}
System.out.println("----接收文件<" + fileName + ">成功-------");
dis.close();
fos.close();
}
serverSocket.close();
}
}