Java网络编程:通过TCP协议传输一个对象到服务端

一个通过TCP协议传输对象数据的小案例。因为先前想在两个程序之间传递一个实例化的对象,但是想不到有什么方法可以实现。最初是想到了将对象内的所有的参数连接成字符串然后进行传递,但是后来发现这样的方法并不实用;后来又想到了使用ObjectOutputStream类将数据写入到磁盘后再通过InputStream获取字节码进行传递到指定对方,然后对方将字节码再存到他的磁盘后通过ObjectInputStream来获取这个对象,但是这种方法亦是非常复杂;实在是没办法,原本想要放弃了。可是突然想到有这个一个类,他叫ByteArrayOnputStream,通过它就可以将对象文件的字节码存储到内存中,然后通过toByteArray()方法获取这个对象的字节码进行传输,在接收方再通过ObjectInputStream类对象来将对象的字节码转换成对象,这样可以省去了在硬盘中生成文件还要去进行删除操作的麻烦。

刚开始的时候编译运行还是出现了错误,着实没能够找出解决的办法。不过经过多次仔细的检查才发现没有使用多线程,并且将Client端放置在了Server端的前面,于是出现了如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
Exception in thread “main” java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.(Socket.java:425)
at java.net.Socket.(Socket.java:208)
at cn.com.lihuan.oicq.Test.main(Test.java:23)

花了好长时间才发现了这个愚蠢的错误,也只能呵呵呵了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package cn.com.lihuan.oicq;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;
public class Test {
public static void main(String[] args) throws IOException, Exception {
// TODO Auto-generated method stub
final SendClass sc = new SendClass(“李欢”);
new Thread() {
public void run() {
ServerSocket ss = null;
SendClass c = null;
try {
ss = new ServerSocket(12345);
Socket socket = ss.accept();
InputStream is = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
c = (SendClass)ois.readObject();
ss.close();
ois.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(c);
}
}.start();
new Thread(new Runnable() {
public void run() {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(bos);
oos.writeObject(sc);
oos.close();
Socket s = new Socket(“127.0.0.1”, 12345);
OutputStream os = s.getOutputStream();
os.write(bos.toByteArray());
s.close();
os.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}
class SendClass implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String name;
public SendClass() {
}
public SendClass(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return “SendClass [name=” + name + “]”;
}
}

如果发现BUG,请留言反馈,谢谢。