java网络编程-实现聊天程序

本文详细介绍了如何使用Java的DatagramSocket实现教师端和学生端的UDP聊天应用,通过多线程处理收发消息,展示了如何在本地主机上创建并管理数据包的收发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用Datagramsocket创建连接,实现UDP,并使用多线程实现教师端和学生端的聊天。
接收端的程序如下:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package chats;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class talkreceive implements Runnable {
    DatagramSocket socket = null;//初始化一个socket连接
    private int port;//端口号
    private String msgfrom;//消息来源

    public talkreceive(int port, String msgfrom) {//构造函数
        this.port = port;
        this.msgfrom = msgfrom;

        try {
            this.socket = new DatagramSocket(this.port);
        } catch (Exception var4) {
            var4.printStackTrace();
        }

    }

    public void run() {
        while(true) {
            try {
                byte[] container = new byte[1024];//开创一个字节数组作为缓冲区
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);//创建一格数据包
                this.socket.receive(packet);//通过传入的socket连接,接受数据包。
                byte[] bytes1 = packet.getData();//读取包中数据
                String ans = new String(bytes1, 0, bytes1.length);
                System.out.println(this.msgfrom + ":" + ans);
                if (!ans.trim().equals("bye")) {
                    continue;
                }//接受到bye则结束聊天。

                this.socket.close();
            } catch (Exception var5) {
                var5.printStackTrace();
            }

            return;
        }
    }
}

数据发送端的写法:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package chats;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class talksend implements Runnable {
    DatagramSocket socket = null;
    BufferedReader bufferedReader = null;
    private int fromport;
    private String toip;
    private int toport;

    public talksend(int fromport, String toip, int toport) {//成员包括发送端口,目标ip,目标端口
        this.fromport = fromport;
        this.toport = toport;
        this.toip = toip;

        try {
            this.socket = new DatagramSocket(fromport);
            this.bufferedReader = new BufferedReader(new InputStreamReader(System.in));//使用bufferreader读取系统流的输入。
        } catch (Exception var5) {
            var5.printStackTrace();
        }

    }

    public void run() {
        while(true) {
            try {
                String data = this.bufferedReader.readLine();//流中的一行字符
                byte[] Data = data.getBytes();
                DatagramPacket packet = new DatagramPacket(Data, 0, Data.length, new InetSocketAddress(this.toip, this.toport));//InetSocketAddress类创建一个目标地址,并将得到的socket作为数据包的发送链接
                this.socket.send(packet);
                String ques = new String(Data, 0, Data.length);
                if (!ques.trim().equals("bye")) {
                    continue;
                }//加trim去掉空格。

                this.socket.close();
            } catch (Exception var5) {
                var5.printStackTrace();
            }

            return;
        }
    }
}

学生类和教师类,创建两个线程,分别为发送和接受。

package chats;

public class talkstudent {
    public talkstudent() {
    }

    public static void main(String[] args) {
        (new Thread(new talksend(7777, "localhost", 9999))).start();//向9999端口发送
        (new Thread(new talkreceive(8888, "老师"))).start();//在8888端口接收
    }
}

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package chats;

public class talkteacher {
    public talkteacher() {
    }

    public static void main(String[] args) {
        (new Thread(new talksend(5555, "localhost", 8888))).start();//向8888端口发送
        (new Thread(new talkreceive(9999, "学生"))).start();//在9999端口接受.
    }
}

附:
java通过URL类,下载网络资源。
首先可以通过网络抓包的方式,获取目标视频或音乐的url的值。
先创建一个URL对象,之后通过openconnection方法创建连接,由于大多数网站使用https协议,将其进行强制类型转换为HttpURLConnection,万物皆为流,使用inputStream读取http连接,在使用FileOutputStream将内容下载到指定的文件位置。

package URLtest;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class URLtest {
    public static void main(String[] args) throws Exception{
        URL url=new URL("https://m701.music.126.net/20210908204202/62ad2629c5959aa955d40bbe360fb3fd/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/10534066865/ec0a/9bbc/3590/b4d04ce9553a85b39d002fbdfa1938e1.m4a");
        HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection();//强转
        InputStream inputStream=httpURLConnection.getInputStream();
        FileOutputStream fos=new FileOutputStream("b4d04ce9553a85b39d002fbdfa1938e1.m4a");
        byte[] bytes=new byte[1024];
        int len;
        while((len=inputStream.read(bytes))!=-1){
            fos.write(bytes,0,bytes.length);
        }
        fos.close();
        inputStream.close();
        httpURLConnection.disconnect();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值