在前面,我有写过一个类似的Socket网络编程,主要是字符传递,这次我们在原来的基础上进行升级,这次传递的是对象。Socket网络编程的基础知识我在这就不重复讲解了,大家可以在我博客中的Socket网络编程栏中找到。
Socket对象传递原理:
- 在客户端,通过ObjectOutputStream来写入(writeObject)Java对象;
- 在服务器,通过ObjectIntputStream对以前使用ObjectOutputStream写入的对象进行反序列化读取或者重构对象;
- 唯一需要注意的是:传递的Java对象需要实现Serializable接口;
这次我们在原来的基础上,
创建一个User对象类:
package com.qhs.entity;
import java.io.Serializable;
public class User implements Serializable{
private String name; // 名字
private String password; // 密码
// 无参构造方法
public User() {
}
// 带参构造方法
public User(String name, String password) {
super();
this.name = name;
this.password = password;
}
//添加get/set方法
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;
}
}
接下来是服务器代码:
package com.qhs.sockettest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import com.qhs.entity.User;
/**
* Socket服务器相关代码
* 编码完成后,要先运行服务器开启端口,然后再运行客户端。
*/
public class LoginServer {
public static void main(String args []){
try {
//1.建立一个服务器Socket绑定一个端口并开始监听
ServerSocket serverSocket = new ServerSocket(8800);
//2.使用accept()方法阻塞等待监听,获得新的连接
Socket socket = serverSocket.accept();
//3.获得输入流
InputStream is = socket.getInputStream();
//获得流:可以对对象反序列化
ObjectInputStream ois = new ObjectInputStream(is);
//获得输出流
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
//4.读取用户信息
User user = (User) ois.readObject();
System.out.println("用户信息:" + user.getName()+"用户密码:"+ user.getPassword());
//添加代码:给客户一个响应
String reply = "服务的响应>>>>Welcome!";
pw.write(reply);
pw.flush();
//5.关闭资源
pw.close();
os.close();
ois.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
然后是客户端代码:
package com.qhs.sockettest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import com.qhs.entity.User;
/**
* 客户端
*/
public class LoginClient {
public static void main(String args []){
try {
//1.建立客服端Socket连接,指定服务器的位置以及端口
Socket socket = new Socket("localhost", 8800);
//2.得到Socket读写流
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
//添加代码:输入流
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//3.利用流按照一定协议对Socket进行读/写操作
User user = new User();
user.setName("qzh"); //传入值
user.setPassword("123456");
oos.writeObject(user); //把对象信息写入
socket.shutdownOutput(); //关闭socket
//添加代码:接收服务器响应并打印显示
String reply = null;
while(!((reply=br.readLine())==null)){
System.out.println("我是客户端,接收到服务器的响应为:" + reply);
}
//4.关闭资源
br.close();
is.close();
oos.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最后我们运行测试,
首先运行服务器代码(开启端口连接),接着再运行客户端;这时我们就可以从后台看到客户端请求传递了User对象中的信息。服务器也得到了响应:
如上图,可以在红箭头视图那里切换服务器与客户端的后台输出信息。这样我们就完成了Socket传递对象的方法了。当然,客户端的用户密码我是写死的,大家在项目使用时,可以直接从客户输入的信息中获得。(这个是只能实现一个用户的传递,只是为了学习测试用,接下来我会写多用户传递,请看3.Socket支持多客户端用户登录)