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支持多客户端用户登录)
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/10458.html