2.Socket网络编程之面对对象编程(图解与源码)


在前面,我有写过一个类似的Socket网络编程,主要是字符传递,这次我们在原来的基础上进行升级,这次传递的是对象。Socket网络编程的基础知识我在这就不重复讲解了,大家可以在我博客中的Socket网络编程栏中找到。

Socket对象传递原理:

  1. 在客户端,通过ObjectOutputStream来写入(writeObject)Java对象;
  2. 在服务器,通过ObjectIntputStream对以前使用ObjectOutputStream写入的对象进行反序列化读取或者重构对象;
  3. 唯一需要注意的是:传递的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支持多客户端用户登录)


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值