使用UDP传输消息对象

使用UDP传输消息对象

最近开发以及即时聊天项目,涉及到socket网络编程这一块,完全自己从零开始敲代码,从最底层开始,其中一个很关键的点就是服务器收到消息的转发功能,
需要使用一个对象封装数据,以及接收者受到该对象后进行解析
不说了,直接上代码

用于封装数据的对象

这个对象一定要实现Serializable接口,
以及在接收方和发送方中的Student对象的包名一定要一致
以下是我的项目结构

使用UDP传输消息对象_第1张图片

package bean;

import java.io.Serializable;

public class Student implements Serializable{

	private String name;
	private int age;
	public Student() {
		super();
		// TODO 自动生成的构造函数存根
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
}

发送方

package Client;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

import bean.Student;



public class Send {

	public static void main(String[] args) throws IOException {
		// TODO 自动生成的方法存根

		//创建udpsocket 
		DatagramSocket datagramSocket = new DatagramSocket();
		InetAddress address = InetAddress.getByName("192.168.110.1");        //目标地址
		
		//序列化对象
		Student student = new Student("小明", 25);		
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ObjectOutputStream oos = new ObjectOutputStream(baos);
		oos.writeObject(student);                                   //序列化对象
		oos.flush();                                                //刷新缓冲区
		
		byte[] sendBuff = baos.toByteArray();
		DatagramPacket dp = new DatagramPacket(sendBuff,sendBuff.length, address, 10000);
		datagramSocket.send(dp);               //发送数据
		System.out.println("成功");
	}

}

接收方

package Server;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

import bean.Student;

public class Recvie {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		// TODO 自动生成的方法存根

		// 1.创建udp scoket,创建端点,监听10000端口
		DatagramSocket recviveSocket = new DatagramSocket(10000);
		// 2.定义数据包用于存储数据
		System.out.println("服务器已启动");
		byte[] receivebuf = new byte[1024];
		DatagramPacket recvivedp = new DatagramPacket(receivebuf, receivebuf.length);
		// 3.通过服务recive方法将接受到的数据存入数据包中
		recviveSocket.receive(recvivedp);

		// 反序列化
		Student student = new Student();
		ByteArrayInputStream bais = new ByteArrayInputStream(receivebuf);
		ObjectInputStream ois = new ObjectInputStream(bais);
		student = (Student) ois.readObject();                             //反序列化恢复对象
		
		System.out.println(student.getName());
		
	}

}

服务端和发送端的包名一定要一致,否则会报错,这个错误一般在用IED编写项目的时候不会出现,主要会出现在导出jar包的时候,建议部署的时候一定要在本机cmd窗口运行jar包是否不会出错,
在cmd命令运行jar包的命令如下
java -jar jar报名字
关于这个问题我会再写一篇博客

你可能感兴趣的:(Java)