`
yidongkaifa
  • 浏览: 4066712 次
文章分类
社区版块
存档分类
最新评论

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对象实例了。

感谢野性的呼唤:http://blog.163.com/liyinhui20080527@126/blog/static/815232582012319609772/


分享到:
评论

相关推荐

    使用Socket传递对象

    使用Socket传递对象,使用Socket传递对象

    通过socket传递java对象(对象序列化)

    NULL 博文链接:https://zxf-noimp.iteye.com/blog/1125401

    服务端接收客户端传递的对象Demo

    将一个对象通过android客户端传递给服务端,这里是服务端接收Demo,详情请看我的博客http://blog.csdn.net/u012702547/article/details/49798709

    Java经典的编程(300例).rar

    实例263 使用Socket传递对象 377 实例264 使用Socket传输图片 379 实例265 使用Socket传输音频 381 实例266 使用Socket传输视频 384 实例267 一个服务器与一个客户端 通信 385 实例268 一个服务器与多个客户端 通信 ...

    C# Winform Sockets收发Json样例

    参照博客C# JSON和对象之间互相转换用Winform进行了JSON和对象之间转化的呈现,并用Socket来传输JSON。原文链接:http://www.cnblogs.com/HCCZX/p/5238556.html

    C# Socket 简单的控制台案例

    1. 实例化并设置socket实例对象 a.创建ip地址和端口 b.绑定监听地址 c.设置一下允许同时访问数 2. 监听连接 a.通过启动一个新的线程执行,这样主线程不会假死(启动线程,所带的参数必须是object类型) b....

    Java对象序列化使用基础

    所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象。这个过程也可以通过...像RMI、Socket、JMS、EJB它们中的一种,彼此为什么能够传递Java对象,当然都是对象序列化机制的功劳。

    C++使用SOCKET实现TCP-IP协议的通讯最好的DEMO源码

    这个对象是用来处理客户端与服务器端数据传输的,此对象由TcpClient获得,在第一步讲过入口参数state,如果我们传递了TcpClient进去,那么,在函数里我们可以根据入口参数state获得,将其进行强制转换TcpClient ...

    socket编程集萃

    因此Java同样提供了一个Socket对象来对其进行支持,只要客户方创建一个Socket的实例对象进行支持就可以了。Socket client=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的IP地址,对于着...

    C# Socket实现简单控制台案例

    1. 实例化并设置socket实例对象  a.创建ip地址和端口  b.绑定监听地址  c.设置一下允许同时访问数 2. 监听连接  a.通过启动一个新的线程执行,这样主线程不会假死(启动线程,所带的参数必须是object类型)  b....

    Android Socket通信实现简单聊天室

    每一个不同的客户端都会建立一个独立的socket,双方都没有关闭连接的话,连接—也就是建立好的这条socket通道将一直保持,服务端要跟那一个客户端通信只需要找到对应的socket对象就可以进行数据传递。 第一次握手:...

    throttled-socket:速率受限网络 IO 的套接字包装器

    用法用法非常简单,只需像往常一样创建一个套接字并将其传递给一个新的ThrottledSocket对象。 ThrottledSocket对象将使用原始套接字进行所有读/写调用,同时确保数据流率不超过您决定的值。一个简单的客户端 import ...

    socket.io-auth:不使用查询字符串验证 socket.io 连接

    安装npm install socket.io-auth用法只需将 socket.io 服务器和auth函数传递给socket.io-auth并在回调中添加其他事件: var io = require ( 'socket.io' ) ( 4000 )// setup and authentication methodauth = ...

    java基于C/S模式基于Socket实现聊天程序,有客户端和服务端,基础代码,仅演示C/S模式下的程序发送与监听原理

    客户端程序创建一个Socket对象并与服务器建立连接,然后从服务器接收消息并提示用户输入消息发送给服务器。服务器端程序创建一个监听Socket对象以等待客户端连接,当有客户端连接时,使用一个新的线程处理该客户端...

    linux网络编程

    udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 Linux网络编程...

    使用SOCKET实现TCP-IP协议的通讯最好的DEMO源码

    这个对象是用来处理客户端与服务器端数据传输的,此对象由TcpClient获得,在第一步讲过入口参数state,如果我们传递了TcpClient进去,那么,在函数里我们可以根据入口参数state获得,将其进行强制转换TcpClient ...

Global site tag (gtag.js) - Google Analytics