2022年07月01日报告

本文介绍了网络编程中的UDP和TCP通讯。首先展示了一个简单的UDP聊天窗口应用,利用DatagramSocket和线程实现广播聊天。接着,通过TCP协议复制docx文件,服务端使用ServerSocket接收并保存文件,客户端发送文件后通知服务器结束上传。实验展示了TCP的可靠性。
摘要由CSDN通过智能技术生成

2022年06月30日讲到了网络编程 同学们

目录

1. 聊天窗口

2.使用TCP进行通讯


 1. 聊天窗口

我们来写一个聊天窗口

public class UDPChat {
    // 这是我们的聊天窗口类
    // 在JAVA的界面应用开发中 主要使用java.awt.* java.swing.* 这两个包下面的类
    public UDPChat() {
        // 建立一个窗口
        JFrame frame=new JFrame("UDP聊天窗口");
        frame.setSize(800,600);
        // 设置窗口不可拉伸
        frame.setResizable(false);
        // 设置窗口在中间出现
        frame.setLocationRelativeTo(null);
        // 使用绝对布局 放入组件时需要确定组件的位置
        frame.setLayout(null);
        // 加一个文本域
        JTextArea show = new JTextArea();
        // 设置文本域的字体
        Font font = new Font("楷体",Font.PLAIN,25);
        show.setFont(font);
        // 设置文本域只能读 不能改
        show.setEditable(false)
        // 加一个滚动条
        JScrollPane pane = new JScrollPane(show,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        // 这里请不要把pane设置得和界面一样宽 留一点给滚动条
        pane.setBounds(0,0,785,400);
        frame.add(pane);


        // 创建一个按钮
        JButton close=new JButton("关闭");
        close.setBounds(600,520,80,30);
        JButton send=new JButton("发送");
        send.setBounds(700,520,80,30);
        Font btnFont = new Font("微软雅黑",Font.PLAIN,15);
        close.setFont(btnFont);
        send.setFont(btnFont);

        // 这个文本域用于输入
        JTextArea input = new JTextArea();
        input.setBounds(0,410,794,100);
        input.setBorder(BorderFactory.createLineBorder(Color.black));
        input.setFont(btnFont);
        frame.add(input);
        frame.add(close);
        frame.add(send);

        // 如果需要给按钮添加功能  就需要加点击事件监听器
        send.addActionListener(new ActionListener() {
            private DatagramSocket socket=null;
            private InetAddress address=null;
            {
                try {
                    socket= new DatagramSocket();
                    // 这个是广播地址
                    address=InetAddress.getByName("192.168.74.255");
                } catch (SocketException e) {
                    e.printStackTrace();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void actionPerformed(ActionEvent e) {// 事件对象
                new UDPThread(show).start();
                String msg = input.getText();
                byte[] bytes=msg.getBytes();
                DatagramPacket packet=new DatagramPacket(bytes,bytes.length,address,8000);
                // 要将信息进行打包发送
                try {
                    socket.send(packet);
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
                input.setText("");
            }
        });
        // 加上这个方法  窗口才能显示出来
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) throws Exception{
        new UDPChat();
    }
}
public class UDPThread extends Thread {
    // 这是我们的聊天线程类
    private JTextArea area = null;
    public UDPThread(JTextArea area) {
        this.area = area;
    }

    @Override
    public void run() {
        try {
            DatagramSocket socket = new DatagramSocket(8000);
            byte[] data = new byte[1024];
            DatagramPacket packet = new DatagramPacket(data, data.length);
            while (true) {
                socket.receive(packet);
                String ip = packet.getAddress().getHostAddress();
                String msg = new String(data, 0, packet.getLength());
                if ("over".equals(msg)) {
                    area.append(ip + ":退出聊天室");
                    break;
                } else {
                    System.out.println(ip + ":" + msg);
                    area.append(ip + ":" + msg + "\n");
                }
            }
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }

写出来的界面是这样的:

 

2.使用TCP进行通讯

据说TCP比UDP可靠一些

我们用TCP复制一个docx文件

public class FileUploadServer {
    // 这是我们的服务端 就是发数据的
    public FileUploadServer() {
        try {
            // 常见服务端Socket
            ServerSocket server = new ServerSocket(8000);
            Socket socket = server.accept();
            System.out.println("接收到一个服务端的连接");
            // 读取客户端
            InputStream input=socket.getInputStream();
            // 这里写复制好的文件放在哪里
            OutputStream output = new FileOutputStream("file./学生激活.docx");
            byte[] bytes=new byte[1024];
            int size=-1;
            while ((size=input.read(bytes))>-1){
                output.write(bytes,0,size);
            }
            System.out.println("上传成功");
            output.close();
            server.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new FileUploadServer();
    }
}
public class FileUploadClient {
    // 这是我们的客户端 就是收数据的
    public FileUploadClient() {
        try {
            // 创立链接
            Socket socket = new Socket("192.168.74.30",8000);
            // 读取本地文件 就是写要复制的文件
            File file = new File("D:/JAVA文档/学生激活.docx");
            FileInputStream input = new FileInputStream(file);
            OutputStream output = socket.getOutputStream();
            byte[] bytes = new byte[1024];
            int size=1;
            while ((size=input.read(bytes))>0){
                output.write(bytes,0,size);
            }
            // 文件上传结束后 告知服务器
            socket.shutdownOutput();
            input.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        new FileUploadClient();
    }
}

同样是先运行服务端 再运行客户端 

 

THE END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒂法挤挤挤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值