`
schy_hqh
  • 浏览: 555994 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(网络编程)通过Socket完成文件上传

 
阅读更多

 

 

/*
上传图片

图片为字节数据,不能用字符流读取
*/

import java.io.*;
import java.net.*;
import static java.lang.System.*;
/*
客户端:
1. 建立客户端点
2,读取客户端已有图片数据
3,通过socket输出流将数据发给服务端
4,读取服务端反馈信息
5,关闭流
*/
class PictureClient 
{
	public static void main(String[] args) throws Exception
	{
		//对客户端上传的图片进行限制

		if(args.length!=1)//args为运行java文件时在后面跟的参数
		{
			out.println("请选择一个jpg格式的图片");
			return ;
		}
		File file = new File(args[0]);
		if(!(file.exists()&&file.isFile()))
		{
			out.println("文件不存在或者文件不正确");
			return ;
		}
		if(!file.getName().endsWith("jpg"))
		{
			out.println("请选择一个jpg格式的图片");
			return ;
		}
		if(file.length()>1024*1024*5)
		{
			out.println("图片大于5M,请重新传入");
			return ;
		}
		

		Socket s = new Socket("127.0.0.1",4456);

		//读图片字节数据
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
		
		//写到socket输出流
		PrintStream out = new PrintStream(s.getOutputStream(),true);
		
		byte[] buf = new byte[1024];
		int len = 0;
		while((len=bis.read(buf))!=-1)
		{
			out.write(buf,0,len);
		}
		s.shutdownOutput();//向socket输入流写入流结束标记
		
		//读取服务端返回的信息
		BufferedReader bufr = 
			new BufferedReader(new InputStreamReader(s.getInputStream()));
		String str = bufr.readLine();
		System.out.println(str);

		s.close();
		bis.close();
	}
}

/*
服务端:
1,建立服务端点
2,通过socket输入流读取客户端上传的数据
3,通过字节输出流将数据写入到新的图片文件
4,反馈信息给客户端
5,关闭流
*/

/*
这个服务端有个局限性,当A客户端连接上以后,被服务端获取到
服务端执行具体流程。这时,B客户连接,只有等待A客户执行完
因为服务端暂时还没有处理完A客户端的请求,
还没有循环回来执行下次accept方法
所以,暂时获取不到B客户端对象

为了可以让多个客户端同时并发访问服务端
那么服务端最好就是将每个客户端封装到一个单独的线程中
这样,就可以同时处理多个客户端的请求

class PictureServer 
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss = new ServerSocket(4456);
		while(true)
		{
			Socket s = ss.accept();	
			//获取客户端IP并显示连接成功
			String ip = s.getInetAddress().getHostAddress();
			System.out.println(ip+"......连接成功");
			
			//字节流读取socket输入流
			BufferedInputStream bis = new BufferedInputStream(s.getInputStream());

			//将字节数据写入到一个新的图片文件中
			PrintStream out = new PrintStream(new FileOutputStream("e:/mypic.jpg"),true);

			byte[] buf = new byte[1024];
			int len = 0;
			while((len=bis.read(buf))!=-1)
			{
				out.write(buf,0,len);
			}
			
			//反馈信息给客户端
			PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
			pw.println("图片上传成功");

			s.close();
			out.close();
		}
		ss.close();
	}
}
*/

//确定客户端需要执行的代码,封装到多线程的run方法中,
//就可以实现服务端的多线程,客户端也就能实现互不影响的访问服务端。
class ServerThread implements Runnable
{
	private Socket s;
	ServerThread(Socket s)
	{
		this.s = s;
	}

	public void run()
	{
		try
		{
			//获取客户端IP并显示连接成功
			String ip = s.getInetAddress().getHostAddress();
			System.out.println(ip+"......连接成功");
			
			//字节流读取socket输入流
			BufferedInputStream bis = new BufferedInputStream(s.getInputStream());

			//将字节数据写入到一个新的图片文件中
			int count = 1;
			File f  = new File("e:/"+ip+".jpg");
			while(f.exists())//如果文件已经存在,则重新命名(可以用ip地址表示不同客户端上传的图片文件)
				f = new File("e:/"+ip+"("+(count++)+")"+".jpg");			
			PrintStream out = new PrintStream(new FileOutputStream(f),true);

			byte[] buf = new byte[1024];
			int len = 0;
			while((len=bis.read(buf))!=-1)
			{
				out.write(buf,0,len);
			}
			
			//反馈信息给客户端
			PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
			pw.println("图片上传成功");

			s.close();
			out.close();
		}
		catch (Exception e)
		{
			new RuntimeException("上传失败");
		}
	}
}

class PictureServer 
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss = new ServerSocket(4456);
		while(true)
		{
			Socket s = ss.accept();	//循环侦听服务器端口是否有访问该端口的进程,有则接收
			
			ServerThread st= new ServerThread(s);//将客户端socket传入服务端

			new Thread(st).start();//开启服务端线程为客户端服务
		}
		//ss.close();
	}
}

 

分享到:
评论

相关推荐

    Socket网络编程-文件上传

    Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-文件上传Socket网络编程-...

    C#网络编程,socket 文件上下传

    本文将深入探讨“C#网络编程,socket文件上传下载”这一主题,帮助开发者理解如何利用C#进行高效且可靠的网络通信。 网络编程是通过网络连接在不同设备间交换数据的过程。在C#中,Socket类提供了实现网络通信的基本...

    JAVA Socket编程实现文件上传

    10. **设计模式**:在实现文件上传服务时,可以借鉴设计模式,如工厂模式用于创建数据库连接,单例模式用于保证服务器Socket实例的唯一性,观察者模式用于通知文件上传完成后的后续处理等。 以上就是使用Java ...

    Socket网络编程之文件上传下载源码

    Socket网络编程是网络通信的基础,尤其在开发涉及服务器与客户端交互的应用时,如文件上传和下载功能。在这个场景中,我们将深入探讨如何使用Java的Socket API实现文件的上传和下载功能。 TCP(Transmission ...

    Socket编程文件上传源代码案例

    在这个"Socket编程文件上传源代码案例"中,我们将深入探讨如何利用Socket和IO流技术来实现在TCP网络上的文件上传功能。 首先,我们需要理解Socket的概念。Socket是操作系统提供的一种进程间通信(IPC)机制,它为...

    python socket 网络编程

    在Python中,socket可以用来实现实时的文件上传和下载。文件传输通常涉及到二进制数据的处理,因此需要使用`socket.sendall()`发送整个文件,而不是逐字符发送。接收端则需要正确地接收并保存文件。注意,由于网络的...

    android使用socket上传、下载文件

    在Android平台上,Socket通信是一种常见的网络编程方式,用于设备间的双向数据传输。Socket提供了一种可靠的、基于连接的传输层通信机制,适用于文件的上传和下载。本篇将详细讲解如何在Android应用中使用Socket进行...

    通过Socket传送文件的例子

    标题中的“通过Socket...总结来说,Socket文件传输涉及到网络编程的基本原理,包括TCP连接的建立、数据的分块传输以及连接的关闭。通过源代码实例,我们可以深入理解这个过程,并学习如何在实际项目中应用这些技术。

    socket文件上传代码

    总的来说,这个"socket文件上传代码"示例展示了如何使用Java的Socket编程技术来实现跨服务器的文件传输,对于理解网络编程和文件上传有很好的实践价值。通过对这部分代码的学习,开发者可以提升自己在网络通信和文件...

    Socket实现文件上传下载,含多线程

    在本示例中,"Socket实现文件上传下载,含多线程" 提到了通过Socket在客户端和服务器之间进行文件传输,并且服务器端采用了多线程处理连接请求,提高了服务的并发能力。下面我们将详细探讨相关的知识点。 1. **...

    基于socket的文件传输

    总的来说,这个项目提供了一个基础的Socket文件传输模型,通过实践可以加深对Java网络编程的理解,为构建更复杂的应用,如聊天室、文件共享系统等打下坚实基础。对于开发者来说,熟练掌握Socket编程不仅可以增强解决...

    socket 文件上传下载

    Socket编程是计算机网络编程中的重要组成部分,主要用于...通过上述内容,我们了解了Socket在文件上传下载中的应用。在实际项目中,开发者需要根据具体需求对这些步骤进行封装和优化,以实现高效、可靠的文件传输功能。

    java-socket大文件上传-含客户端和服务端

    本项目“java-socket大文件上传-含客户端和服务端”旨在演示如何利用Java Socket API来实现大文件的上传功能,这对于网络应用如文件分享、云存储服务等至关重要。 首先,我们要理解Socket的工作原理。Socket是一种...

    socket实现文件上传下载

    通过本文的介绍,我们可以了解到使用 Socket 实现文件上传下载的基本原理和步骤。这种实现方式适用于简单的文件传输需求。对于更复杂的场景,如大文件传输、断点续传等,可能需要考虑更高级的技术方案,例如使用 ...

    华农网络编程socket通信

    通过学习和实践“华农网络编程socket通信”课程,学生可以掌握网络通信的核心技术,为开发各种网络应用打下坚实基础。在实际项目中,理解并灵活运用Socket编程能够解决许多网络通信问题,提升系统的稳定性和效率。

    socket实现上传文件工具类

    三、Socket文件上传工具类设计 1. 客户端: - 创建Socket连接:`Socket socket = new Socket(serverIP, serverPort);` - 打开本地文件:`FileInputStream fis = new FileInputStream(file);` - 发送文件:通过...

    C#Socket编程定时批量上传文件示例

    在本文中,我们将深入探讨如何使用C#进行Socket编程,特别是在实现定时批量上传文件到服务器的应用场景中。C#作为微软开发的面向对象的编程语言,具有强大的网络编程能力,Socket编程是其在网络通信中的核心部分。让...

    网络 网络编程 Socket WinInet 网络课件

    在这个主题中,我们主要关注两个关键的编程接口:Socket和WinInet,它们是Windows操作系统中用于实现网络应用的重要工具。 Socket,通常被称为套接字,是网络通信的基础。它是一个编程接口(API),允许应用程序...

    安卓使用socket上传文件demo

    在这个“安卓使用socket上传文件demo”中,我们将深入探讨如何利用Socket在安卓应用中实现文件上传功能。 首先,让我们了解Socket的基本概念。Socket是网络通信的基础,它允许两个网络端点(通常是服务器和客户端)...

    socket 超大文件上传

    超大文件上传通常面临两个主要挑战:内存管理及连接稳定性。对于内存管理,一次性加载整个4GB文件到内存是不切实际的,因为这可能导致“out of memory”错误。为了解决这个问题,我们需要采用流式传输(streaming)...

Global site tag (gtag.js) - Google Analytics