使用UDP传输消息对象
最近开发以及即时聊天项目,涉及到socket网络编程这一块,完全自己从零开始敲代码,从最底层开始,其中一个很关键的点就是服务器收到消息的转发功能,
需要使用一个对象封装数据,以及接收者受到该对象后进行解析
不说了,直接上代码
用于封装数据的对象
这个对象一定要实现Serializable接口,
以及在接收方和发送方中的Student对象的包名一定要一致
以下是我的项目结构
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报名字
关于这个问题我会再写一篇博客