目前自己正在学习socket,参考网上的代码,自己用JAVA写了一个可以实现服务端和客户端实现文件传输图片,目前只在局域网中测过。
使用时,先运行服务端,在运行客户端,路径可根据需要更改。
服务端代码:
主类:
package link;
import java.net.ServerSocket;
import java.net.Socket;
public class mainFunction{
private static final int PORT = 8083;
private static ServerSocket serverSocket;
private static Socket socket;
public static void main(String[] args)
{
try{
//监听端口
serverSocket = new ServerSocket(PORT);
while(true){
//创建连接
System.out.println("正在创建和用户的socket的连接");
socket = serverSocket.accept();
System.out.println("成功创建和用户的socket的连接");
//接受
ReceivePicture receivePicture = new ReceivePicture(socket);
receivePicture.getMessage();
//发送
SendPicture sendPicture = new SendPicture(socket);
sendPicture.sendPictureToClient();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
接受类:
package link;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.net.Socket;
public class ReceivePicture {
private Socket socket;
public ReceivePicture(Socket socket)
{
this.socket = socket;
}
public void getMessage(){
try{
String savePath ="F:\\学习\\imagine cup\\example\\"; //接受文件的保存路径,根据需求改
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
int passedlen = 0; //已接受文件的长度
long len = 0; //文件的总长
DataInputStream inputStream = new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
//读取文件名
savePath += inputStream.readUTF();
//读取文件长度
len = inputStream.readLong();
System.out.println("文件长度为:"+len+"\n");
System.out.println("开始接受文件" + "\n");
//创建输出流
DataOutputStream fileOut = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(savePath)));
//开始读取文件
while(true){
int read = 0;
if(inputStream != null){
read = inputStream.read(buf);
}
passedlen = passedlen + read;
if(read == -1 ){
break;
}
System.out.println(read);
//进度条表示接受了多少,可能重复打印出相同的百分比
System.out.println("文件接受了" + (passedlen*100/len)+"%\n");
fileOut.write(buf,0,read);
if(passedlen == len){
break;
}
}
System.out.println("接受完成,文件存为"+savePath+"\n");
fileOut.close();
}catch(Exception e){
System.out.println("接受消息错误");
return;
}
}
}
发送类
package link;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;
public class SendPicture {
private Socket socket;
public SendPicture(Socket socket) {
// TODO Auto-generated constructor stub
this.socket= socket;
}
/**
*
* 向客户端发送图片
*/
public void sendPictureToClient()
{
try{
//选择进行传输的文件
File file = new File("F:\\学习\\imagine cup\\example\\1.jpg"); //根据需要更改
// public Socket accept() throws
// IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
DataInputStream fis = new DataInputStream(
new BufferedInputStream(new FileInputStream(file)));
DataOutputStream ps = new DataOutputStream(socket.getOutputStream());
//将文件名及长度传送给客户端.这里要真正使用所有平台,例如中文名的处理,还需要加工
//具体修改方法去看think in java 4th里的现成代码
ps.writeUTF(file.getName());
ps.flush();
ps.writeLong((long)file.length());
ps.flush();
int bufferSize = 8192; //1KB的缓存
byte[] buf = new byte[bufferSize];
while(true){
int read = 0;
if(fis != null){
read = fis.read(buf);
}
if(read == -1)
break;
ps.write(buf,0,read);
}
ps.flush();
//关闭socket,不然客户端会一直等待数据传过来
fis.close();
socket.close();
System.out.println("文件传输完成");
}catch(Exception e){
e.printStackTrace();
}
}
}
客户端代码(基本和服务端代码是一样的):
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.Socket;
public class test {
private static String IP = "192.168.1.114";
private static int PORT = 8083;
private static Socket socket;
public static void main(String[] args)
{
try{
socket = new Socket(IP,PORT);
System.out.println("连接服务器成功!"+"\n");
}catch(Exception e){
e.printStackTrace();
System.out.println("连接服务器失败!"+"\n");
}
try{
String filePath = "D:\\shan\\2.jpg";
File file = new File(filePath);
System.out.println("文件长度" + (int) file.length());
DataInputStream fis = new DataInputStream(
new BufferedInputStream(new FileInputStream(filePath)));
DataOutputStream ps = new DataOutputStream(socket.getOutputStream());
ps.writeUTF(file.getName());
ps.flush();
ps.writeLong((long)file.length());
ps.flush();
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
while(true){
int read = 0;
if(fis != null){
read = fis.read(buf);
}
System.out.println(read);
if(read == -1)
break;
ps.write(buf,0,read);
}
ps.flush();
fis.close();
}catch(Exception e){
e.printStackTrace();
}
try{
String savePath ="D:\\shan\\"; //接受文件的保存路径,根据需求改
int bufferSize = 8192;
byte[] buf = new byte[bufferSize];
int passedlen = 0; //已接受文件的长度
long len = 0; //文件的总长
DataInputStream inputStream = new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
//读取文件名
savePath += inputStream.readUTF();
//创建输出流
DataOutputStream fileOut = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream(savePath)));
//读取文件长度
len = inputStream.readLong();
System.out.println("文件长度为:"+len+"\n");
System.out.println("开始接受文件" + "\n");
//开始读取文件
while(true){
int read = 0;
if(inputStream != null){
read = inputStream.read(buf);
}
passedlen = passedlen + read;
if(read == -1){
break;
}
//进度条表示接受了多少,可能重复打印出相同的百分比
System.out.println("文件接受了" + (passedlen*100/len)+"%\n");
fileOut.write(buf,0,read);
}
System.out.println("接受完成,文件存为"+savePath+"\n");
fileOut.close();
}catch(Exception e){
System.out.println("接受消息错误");
return;
}
}
}
本人没有系统的学习过JAVA,所以代码虽然能用,但可能非常不符合JAVA的语言规范,所以仅供大家参考。
我也是刚刚接触socket,希望能给和我一样的学习者有些许的帮助,也希望各路大神能帮助我更好的学习,指正我的错误和不足。
第一次发帖,排版可能很不顺眼,希望大家见谅
参考文章地址:http://www.cnblogs.com/Tiger-Dog/articles/1918661.html