`
从此醉
  • 浏览: 1060167 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

Java Socket实战之三 传输对象

 
阅读更多

本文地址:http://blog.csdn.net/kongxx/article/details/7259827

Java Socket实战之一 单线程通信

Java Socket实战之二 多线程通信

前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象。

首先需要一个普通的对象类,由于需要序列化这个对象以便在网络上传输,所以实现java.io.Serializable接口就是必不可少的了,入下:

package com.googlecode.garbagecan.test.socket.sample3;

public class User implements java.io.Serializable {
	private static final long serialVersionUID = 1L;
	private String name;
	private String password;

	public User() {
		
	}
	
	public User(String name, String password) {
		this.name = name;
		this.password = password;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}
对于Server端的代码,代码中分别使用了ObjectInputStream和ObjectOutputStream来接收和发送socket中的InputStream和OutputStream,然后转换成Java对象,如下:

package com.googlecode.garbagecan.test.socket.sample3;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MyServer {

	private final static Logger logger = Logger.getLogger(MyServer.class.getName());
	
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(10000);

		while (true) {
			Socket socket = server.accept();
			invoke(socket);
		}
	}

	private static void invoke(final Socket socket) throws IOException {
		new Thread(new Runnable() {
			public void run() {
				ObjectInputStream is = null;
				ObjectOutputStream os = null;
				try {
					is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
					os = new ObjectOutputStream(socket.getOutputStream());

					Object obj = is.readObject();
					User user = (User)obj;
					System.out.println("user: " + user.getName() + "/" + user.getPassword());

					user.setName(user.getName() + "_new");
					user.setPassword(user.getPassword() + "_new");

					os.writeObject(user);
					os.flush();
				} catch (IOException ex) {
					logger.log(Level.SEVERE, null, ex);
				} catch(ClassNotFoundException ex) {
					logger.log(Level.SEVERE, null, ex);
				} finally {
					try {
						is.close();
					} catch(Exception ex) {}
					try {
						os.close();
					} catch(Exception ex) {}
					try {
						socket.close();
					} catch(Exception ex) {}
				}
			}
		}).start();
	}
}
Client也和Server端类似,同样使用ObjectOutputStream和ObjectInputStream来处理,如下:
package com.googlecode.garbagecan.test.socket.sample3;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MyClient {
	
	private final static Logger logger = Logger.getLogger(MyClient.class.getName());
	
	public static void main(String[] args) throws Exception {
		for (int i = 0; i < 100; i++) {
			Socket socket = null;
			ObjectOutputStream os = null;
			ObjectInputStream is = null;
			
			try {
				socket = new Socket("localhost", 10000);
	
				os = new ObjectOutputStream(socket.getOutputStream());
				User user = new User("user_" + i, "password_" + i);
				os.writeObject(user);
				os.flush();
				
				is = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
				Object obj = is.readObject();
				if (obj != null) {
					user = (User)obj;
					System.out.println("user: " + user.getName() + "/" + user.getPassword());
				}
			} catch(IOException ex) {
				logger.log(Level.SEVERE, null, ex);
			} finally {
				try {
					is.close();
				} catch(Exception ex) {}
				try {
					os.close();
				} catch(Exception ex) {}
				try {
					socket.close();
				} catch(Exception ex) {}
			}
		}
	}
}
最后测试上面的代码,首先运行Server类,然后运行Client类,就可以分别在Server端和Client端控制台看到接收到的User对象实例了。

分享到:
评论

相关推荐

    Socket网络编程进阶与实战系统掌握Socket核心技术

    Socket网络编程进阶与实战系统掌握Socket核心技术,本课程将理论结合实践,带你从零开始,系统学习Socket编程技术,让Socket的学习不再那么零散与难以掌握,同时会提炼出Socket网络传输的核心思想与构架,并带你踩坑...

    基于java的modbus TCP通信

    Modbus 协议是一项应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信,包括 ASCII、RTU、TCP 三种报文类型。 Modbus TCP 数据帧由 MBAP 和 PDU 两部分组成。MBAP 是报文头,长度为...

    Socket网络编程进阶与实战教程.zip

    让大家对Socket有个大概的概念与方向。之后通过几个小Case引出课程的主角,轻松愉快的让你体验到Socket编程的快感。本章节主要收获:1. 明白什么是网络编程,2. 理解Socket与TCP、UDP的关系 3. 明白网络传输中的报文...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    5.2.3 序列化的几种方式 在Java中socket传输数据时,数据类型往往比较难选择。可能要考虑带宽、跨语言、版本的兼容等问题。比较常见的做法有两种: 一是把对象包装成JSON字符串传输, 二是采用Java对象的序列化和反...

    JAVA实战项目源码-计算机毕业设计java专业-项目源码-项目说明介绍-基于JAVA的网络通讯系统设计与实现(论文+系统)

    JAVA实战项目源码-计算机毕业设计java专业-项目源码-项目说明介绍-基于JAVA的网络通讯系统设计与实现(论文+系统) 一般来说,聊天工具大多数由客户端程序和服务器程序,外加服务器端用于存放客户数据的数据库组成,...

    Netty实战_Netty的概念及体系结构_编解码器_网络协议_案例研究.pdf

    Netty实战_Netty的概念及体系结构_编解码器_网络协议_案例研究.pdf Netty是Java网络编程的高性能框架,提供了异步和事件驱动的编程模型。 Netty 的核心组件包括 Channel、EventLoop 和 ChannelFuture。Channel 是 ...

    java自学之道

    第一篇 基础篇 第0章 JDK安装和最简单的环境变量配置方法 第1章 Java基础概念 一、 Java基础语法 ... 第三篇 实战篇 第7章 项目开发 7.1 开发自己的浏览器 7.2 开发自己的象棋游戏 7.3 网络主机线程扫描与端口控制

    从NIO到Netty,编程实战出租车905协议-08172347.pdf

    905.4-2014协议,是交通运输部公路科学研究院起草定制的一个协议标准,它也是基于TCP之上的一个应用层传输协议。 第2章,介绍在Socket编程过程中一些基础知识,让大家建立起对这块知识内容的一个整体轮廓; 第3章,...

    一站式学习Java网络编程 全面理解BIO:NIO:AIO1

    本课程旨在帮助学生全面理解 Java 网络编程中的 BIO、NIO、AIO 三剑客,掌握 RPC 编程的基础知识,并结合实战项目巩固所学。 一、网络编程三剑客 - BIO、NIO、AIO BIO(Blocking I/O)是一种同步阻塞式 I/O 模式,...

    基于JAVA的网络通讯系统设计与实现源码+文全套

    系统架构:基于JAVA Socket实现,采用多线程、IO流和数据传输协议等技术。 功能模块:包括用户登录、注册、私聊、群聊、文件传输等模块。 技术要点:包括Socket连接的建立与维护、多线程编程、IO流的使用、数据...

    Vue+Java 通过websocket实现服务器与客户端双向通信操作

    主要介绍了Vue+Java 通过websocket实现服务器与客户端双向通信操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    netty-server中采用的分包拆包源码,java开发用于实战项目

    @Component public class RabbitmqConfig { private final static String message = "web.socket.message";...完整代码,下载有详细说明,使用于长报文通讯,将报文长度截取一定字节发送,便于网速传输中丢包

    Java聊天应用程序 - 创建一个基本的即时聊天应用

    在这篇Java实战博客中,我们将详细介绍如何构建一个简单的聊天应用程序,包括以下内容: 项目概述 构建服务器端 构建客户端 实现消息传输 运行聊天应用程序 总结 我们将使用Java的Socket编程来实现服务器端和客户端...

    JZMQ消息队列框架安装配置文档.txt

    ZMQ被称为史上最快消息队列,它处于会话层之上,应用层之下,使用后台异步线程完成消息的接受和发送,完美的封装了Socket API, 大大简化了编程人员的复杂度,被称为史上最强大的消息中间件。ZMQ是用C语言编写的,...

    Java毕业设计-基于JAVA的网络通讯系统设计与实现(论文+系统).rar

    * 深入分析了Java网络编程的关键技术,如Socket通信、多线程处理等,并通过实例进行了验证。 * 全面介绍了系统的架构设计、功能模块划分以及数据库设计,展现了系统的高度模块化与可扩展性。 * 对系统的实现过程进行...

    IO_deep_learning_notes.zip

    187 网络编程java API 实战多路复用器开发 地址 189 全手写急速理解Netty模型及IO模型应用实战 地址 191 Netty之IO模型开发本质手写部分实现推导篇 地址 196 全手写基于Netty的RPC框架自定义协议,连接池 地址 ...

    SpringCloud+Netty集群实战千万级 IM系统

    1.设计优雅:适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型 - 单线程,一个或多个线程池. 2.使用方便:详细记录的 Javadoc,用户...

Global site tag (gtag.js) - Google Analytics