Socket网络编程之面向对象编程

Socket对象传递原理:在客户端,通过ObjectOutputStream来写入(writeObject)Java对象;在服务器,通过Obje

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网络编程之面向对象编程

Socket网络编程之面向对象编程

如上图,可以在红箭头视图那里切换服务器与客户端的后台输出信息。这样我们就完成了Socket传递对象的方法了。当然,客户端的用户密码我是写死的,大家在项目使用时,可以直接从客户输入的信息中获得。(这个是只能实现一个用户的传递,只是为了学习测试用,接下来我会写多用户传递,请看3.Socket支持多客户端用户登录)

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

(0)
上一篇 2023年 4月 22日 下午11:59
下一篇 2023年 4月 22日 下午11:59

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信