java编写收发消息程序

java编写收发消息程序

代码参考:

https://github.com/GISWLH/java_send_project

任务目标

  • 程序设计,数据收发(格式自定、数据自定),用户界面自定 ,一个接收方,一个发送方;

  • 当接收方收到发送方发送的消息后,打印发送的消息及发送方的地址和端口号,之后向发送方反馈信息“收到了!”;

  • 发送方打印出接收方反馈的消息。

文档格式

文件 说明
README 作业说明
result 运行结果
src java源代码
out 编译后的文件

整个project可以用IDEA打开

先运行Recieve,再运行Sender

功能实现

数据收发

Receive

import javax.swing.*;
import java.awt.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketAddress;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import javax.swing.JLabel;
public class Receive {

    public static void main(String[] args) {
        try {
            InetAddress ip = InetAddress.getLocalHost();
            int port = 8888;

            // 创建接收方的套接字,并制定端口号和IP地址
            DatagramSocket getSocket = new DatagramSocket(port, ip);

            // 确定数据报接受的数据的数组大小
            byte[] buf = new byte[1024];

            // 创建接受类型的数据报,数据将存储在buf中
            DatagramPacket getPacket = new DatagramPacket(buf, buf.length);

            // 通过套接字接收数据
            getSocket.receive(getPacket); //有问题



            // 解析发送方传递的消息,并打印
            String getMes = new String(buf, 0, getPacket.getLength());

            System.out.println("对方发送的消息:" + getMes);

            // 通过数据报得到发送方的IP和端口号,并打印
            InetAddress sendIP = getPacket.getAddress();
            int sendPort = getPacket.getPort();

            System.out.println("对方的IP地址是:" + sendIP.getHostAddress());
            System.out.println("对方的端口号是:" + sendPort);

            // 通过数据报得到发送方的套接字地址
            SocketAddress sendAddress = getPacket.getSocketAddress();

            // 确定要反馈发送方的消息内容,并转换为字节数组
            String feedback = "收到了!";
            byte[] backBuf = feedback.getBytes();

            // 创建发送类型的数据报
            DatagramPacket sendPacket = new DatagramPacket(backBuf,
                    backBuf.length, sendAddress);

            // 通过套接字发送数据
            getSocket.send(sendPacket);

            // 关闭套接字
            getSocket.close();

            //窗口自定
            JFrame frame = new JFrame("Title for your window");

            JPanel panel = new JPanel();

            JLabel l = new JLabel();
            ImageIcon icon = new ImageIcon("img_1.png");     //在此直接创建对象,注意目录之间的分隔符是双斜线
            l.setIcon(icon);
            l.setBounds(10, 10, icon.getIconWidth(),icon.getIconHeight());
            panel.add(l,new Integer(Integer.MIN_VALUE));


            JLabel label = new JLabel("对方发送的消息:" + getMes );
            JLabel label1 = new JLabel("对方的IP地址是:" + sendIP.getHostAddress());
            JLabel label2 = new JLabel("对方的端口号是:" + sendPort);
            JLabel label_kong = new JLabel("           ");
            JLabel label3 = new JLabel("收到了!");
            Font f = new Font("宋体",Font.PLAIN,16);
            label3.setFont(f);
            label3.setForeground(Color.red);
            Container con = frame.getContentPane();    //用getContentPane()方法获得JFrame的内容面板
            con.setBackground(Color.blue);    //设置背景颜色为蓝色

            //距离屏幕左边100个像素,上边100个像素,窗口的宽是300,高是300
            frame.setBounds(100,100,300,300);    //设置窗口1在屏幕上的位置及大小
            frame.setVisible(true);
            panel.add(label);
            panel.add(label1);
            panel.add(label2);
            panel.add(label_kong);
            panel.add(label3);
            frame.add(panel);
            //Menu无法直接添加到容器中,只能直接添加到菜单容器中
            MenuBar mb = new MenuBar(); //创建菜单容器
            frame.setMenuBar(mb);
            //添加菜单
            Menu m1 = new Menu("File");
            Menu m2 = new Menu("Edit");
            Menu m3 = new Menu("Help");
            mb.add(m1);
            mb.add(m2);
            mb.add(m3);

            //添加菜单项
            MenuItem mi1 = new MenuItem("Save");
            MenuItem mi2 = new MenuItem("Load");
            MenuItem mi3 = new MenuItem("Quit");
            m1.add(mi1);
            m1.add(mi2);
            m1.addSeparator(); //添加分隔线
            m1.add(mi3);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Send

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Sender {
    public static void main(String[] args) {
        try {
            // 创建发送方的套接字,IP默认为本地,端口号随机
            System.out.println("Hello world!");
            DatagramSocket sendSocket = new DatagramSocket();

            // 确定要发送的消息:
            String mes = "这是我的java作业!";

            // 由于数据报的数据是以字符数组传的形式存储的,所以传转数据
            byte[] buf = mes.getBytes();

            // 确定发送方的IP地址及端口号,地址为本地机器地址
            int port = 8888;
            InetAddress ip = InetAddress.getLocalHost();

            // 创建发送类型的数据报:
            DatagramPacket sendPacket = new DatagramPacket(buf, buf.length, ip,
                    port);

            // 通过套接字发送数据:
            sendSocket.send(sendPacket);

            // 确定接受反馈数据的缓冲存储器,即存储数据的字节数组
            byte[] getBuf = new byte[1024];

            // 创建接受类型的数据报
            DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length);

            // 通过套接字接受数据
            sendSocket.receive(getPacket);

            // 解析反馈的消息,并打印
            String backMes = new String(getBuf, 0, getPacket.getLength());
            System.out.println("接受方返回的消息:" + backMes);

            // 关闭套接字
            sendSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

result

本文由mdnice多平台发布

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容