当前位置: 首页 > news >正文

Java socket(三)使用TCP传输文件

2019独角兽企业重金招聘Python工程师标准>>> hot3.png


public class SocketClient
{
	public static void main(String args[]) throws Exception
	{	
		Socket socket = new Socket("192.168.100.236", 2221);
		System.out.println("socket created");

		//send request
		OutputStream os = socket.getOutputStream();
		DataOutputStream oos = new DataOutputStream(os);

                //协议的数据类型
		oos.write("1".getBytes());//在发送正式数据之前,先发送这个协议的数据类型标记,相当于一个头
		oos.flush();

                //将f:\leave.jpg发送给服务端
		BufferedInputStream fis = new BufferedInputStream(new FileInputStream("f:\\leave.jpg"));
                byte[] buf = new byte[1024];
                int length;
		while((length = fis.read(buf, 0, buf.length))!=-1)
		{
		     oos.write(buf, 0, length);
		     oos.flush();
		}
		socket.shutdownOutput();

		//receive response
		InputStream is = socket.getInputStream();
		ObjectInputStream ois = new ObjectInputStream(is);
		MsgTO obj = (MsgTO) ois.readObject();	
		System.out.println("Received:"+obj);
		if(obj != null)
		{
			System.out.println("status="+obj.getStatus());
			System.out.println("response="+obj.getResponse());
		}
		socket.shutdownInput();

		
		//close resource
		oos.close();
		fis.close();
		os.close();
		socket.close();
	}
}

	
 public class SocketServer
{
    public static void main(String args[]) throws Exception
    {    	
        ServerSocket serverSocket = new ServerSocket(2221);
        System.out.println("server socket created");
        //for multiple clients
        while (true) //循环监听,等待客户端的连接
	{
			System.out.println("***");
			Socket socket = serverSocket.accept();
			ServerHandler serverHandler = new ServerHandler(socket);
			serverHandler.setPriority(4);//设置线程的优先级来保证运行速度, 范围为[1,10], 默认为5.
			serverHandler.start();					
	}
    }

   class ServerHandler extends Thread
   {
	private final Logger logger = LoggerFactory.getLogger(getClass());
	
	//与本线程相关的Socket
	private Socket socket = null;
	
	public ServerHandler(Socket socket)
	{
		this.socket = socket;
	}
	
	//线程执行的操作
	//for file
	public void run()
	{
		InputStream is = null;
		DataInputStream ois = null;
		BufferedOutputStream bos = null;

		OutputStream os = null;
	        ObjectOutputStream oos = null;
		try 
		{
			//receives request
			is = socket.getInputStream();
			ois = new DataInputStream(is);
		
                        //协议的数据类型
			byte[] flag = new byte[1];
			int len = ois.read(flag);//在接收正式数据之前,先接收协议的数据类型,这个头信息。
			logger.info("length="+len);
			String flags = new String(flag);
			logger.info("flag=" + flags);

			//接收文件到e:\lyy.jpg
			File file = new File("e:\\lyy2.jpg");
			file.createNewFile();
			bos = new BufferedOutputStream(new FileOutputStream(file));
			byte[] buf = new byte[1024];
			int length;
			while((length = ois.read(buf))!=-1)
			{
				bos.write(buf, 0, length);
			    bos.flush();
			}			
			socket.shutdownInput();
			

			//deal is still to do
			//send response
			os = socket.getOutputStream();
			oos = new ObjectOutputStream(os);
			logger.debug("send response");
			MsgTO obj = new MsgTO();
			if(obj != null)
			{
				obj.setStatus(0);
				obj.setResponse("123");
				oos.writeObject(obj);
			}
			oos.flush();
			socket.shutdownOutput();
		} catch (Exception ex) 
		{
			logger.error(ex.getMessage());
			ex.printStackTrace(System.out);
		} finally 
		{			
			try //close resource
			{
				oos.close();
				bos.close();				
				ois.close();
				is.close();
				socket.close();
			} catch (Exception ex) 
			{
				ex.printStackTrace(System.out);
			}
		}
       }	
}

转载于:https://my.oschina.net/liuyuanyuangogo/blog/812176

相关文章:

  • [独库骑行之我们穿过草原]巴音布鲁克大草原
  • angular-ui-bootstrap (1)
  • firefox播放mms流媒体(网络电视)
  • 学习Oracle的好地方
  • easyui datagrid 行右键生成 动态获取(toolbar) 按钮
  • SQL中 对逻辑值取反赋值的语句
  • 验证码的前世今生(前世篇)
  • PHP课程总结20161228
  • 公司地址变更:工商、税务变更流程(转)
  • js 获取 url 中的参数, 并保证获取到的参数不乱码
  • sqlserver2005此数据库没有有效所有者,因此无法安装数据库关系图支持对象的解决方法...
  • JAVA 一个或多个空格分割字符串
  • Michael: 变革管理 应对挑战
  • 如何为你的微信小程序瘦身?
  • A卡于N卡的华山论剑
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 4. 路由到控制器 - Laravel从零开始教程
  • css的样式优先级
  • ES学习笔记(12)--Symbol
  • happypack两次报错的问题
  • interface和setter,getter
  • learning koa2.x
  • Redux系列x:源码分析
  • RxJS: 简单入门
  • underscore源码剖析之整体架构
  • 电商搜索引擎的架构设计和性能优化
  • 回顾 Swift 多平台移植进度 #2
  • 手机端车牌号码键盘的vue组件
  • 一个完整Java Web项目背后的密码
  • 回归生活:清理微信公众号
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #WEB前端(HTML属性)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (C语言)fread与fwrite详解
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Java数据结构)ArrayList
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .dwp和.webpart的区别
  • .Mobi域名介绍
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net实现客户区延伸至至非客户区
  • .NET性能优化(文摘)
  • .pop ----remove 删除