使用socket实现局域网内两个电脑之间图片的收发

目前自己正在学习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


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值