UDP编程

该示例展示了UDP协议在Java中的应用,包括基本的消息发送和接收,多线程实现的聊天功能,以及利用HTTP下载网络资源。在UDP通信中,服务端接收客户端发送的数据,并进行响应;多线程聊天应用模拟了学生和老师之间的双向通信;下载网络资源的示例使用HttpURLConnection完成文件的下载操作。
摘要由CSDN通过智能技术生成

UDP

示例一:消息发送一

源代码:

服务端:

package cn.ecut.udp;

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

public class UdpServerDemo01 {
    public static void main(String[] args) throws Exception {
        //开放端口 与服务不一样
        DatagramSocket socket=new DatagramSocket(9090);
        //接收数据包
        byte[] buffer=new byte[1024];
        DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);
        socket.receive(packet);
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        //关闭连接
        socket.close();
    }
}

客户端:

package cn.ecut.udp;

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

//客户端,不需要连接服务器
public class UdpClientDemo01 {
    public static void main(String[] args) throws Exception {
        //1.建立一个Socket连接点
        DatagramSocket socket=new DatagramSocket();
        //2.建个包
        String msg="Hello";
        InetAddress localhost=InetAddress.getByName("localhost");
        int part=9090;
        DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,part); //数据,数据的长度起始,要发送给谁
        //3.发送包
        socket.send(packet);
        //4.关闭流
        socket.close();
    }
}

运行结果:
在这里插入图片描述

示例二:消息发送二

源代码:

接收端:

package cn.ecut.chat;

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

public class UdpReceiveDemo01 {
    public static void main(String[] args) throws Exception {
        //连接点
        DatagramSocket socket=new DatagramSocket(6666);
        //无限接收包裹 必须要有一个判断条件使其跳出循环
        while(true){
            //接收包裹
            byte[] container=new byte[1024];
            DatagramPacket packet=new DatagramPacket(container,0,container.length);
            socket.receive(packet);
            //拆开包裹
            byte[] data= packet.getData();
            String receiveData=new String(data,0, data.length);
            System.out.println(receiveData);
            //若发现是"bye"则断开
            if(receiveData.equals("bye")){
                break;
            }
        }
        //关闭流
        socket.close();
    }
}

发送端:

package cn.ecut.chat;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.*;

public class UdpSenderDemo01 {
    public static void main(String[] args) throws Exception {
        //连接点
        DatagramSocket socket=new DatagramSocket(8888);
        //监听键盘
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        //准备数据,控制台读取System.in
        //无限发送包裹 必须要有一个判断条件使其跳出循环
        while(true){
            String data=reader.readLine();
            byte[] datas=data.getBytes();
            //数据发送到哪里
            DatagramPacket packet=new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
            //发送包裹
            socket.send(packet);
            //当输入bye时关闭
            if(data.equals("bye")){
                break;
            }
        }
        //关闭流
        socket.close();
        reader.close();

    }
}

运行结果:

在这里插入图片描述

示例三:多线程实现聊天

源代码:

TalkStudent.java

package cn.ecut.chat;

public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSend(1,"localhost",2)).start();
        new Thread(new TalkReceive(3,"老师")).start();
    }
}

TalkTeacher.java

package cn.ecut.chat;

public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TalkSend(4,"localhost",3)).start();
        new Thread(new TalkReceive(2,"学生")).start();
    }
}

TalkReceive.java

package cn.ecut.chat;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class TalkReceive implements Runnable{
    DatagramSocket socket=null;
    private String msgPort;
    private int port;
    public TalkReceive(int port,String msgPort) {
        this.port = port;
        this.msgPort=msgPort;
        try {
            socket = new DatagramSocket(port);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    @Override
    public void run() {
        //连接点
        //无限接收包裹 必须要有一个判断条件使其跳出循环
        try {
            while(true){
                //接收包裹
                byte[] container=new byte[1024];
                DatagramPacket packet=new DatagramPacket(container,0,container.length);
                socket.receive(packet);
                //拆开包裹
                byte[] data= packet.getData();
                String receiveData=new String(data,0, data.length);
                System.out.println(this.msgPort+":"+receiveData);
                //若发现是"bye"则断开
                if("bye".equals(receiveData)){
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        //关闭流
        socket.close();
    }
}

TalkSend.java

package cn.ecut.chat;

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 reader=null;
    private int fromPort;
    private String toIp;
    private int toPart;
    public TalkSend(int fromPort,String toIp,int toPart){
        this.fromPort=fromPort;
        this.toIp=toIp;
        this.toPart=toPart;
        try{
            socket=new DatagramSocket(fromPort);
            reader=new BufferedReader(new InputStreamReader(System.in));
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        while(true){
            try{
                String data=reader.readLine();
                byte[] datas=data.getBytes();
                //数据发送到哪里
                DatagramPacket packet=new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIp,this.toPart));
                //发送包裹
                socket.send(packet);
                //当输入bye时关闭
                if("bye".equals(data)){
                    break;
                }
            }
            catch(Exception e){
                e.printStackTrace();
            }

        }
        //关闭流
        socket.close();

    }
}

运行结果:
在这里插入图片描述
在这里插入图片描述

示例四:下载网络资源

源代码:

package cn.ecut.chat;

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

public class UrlDown {
    public static void main(String[] args) throws IOException {
        URL url=new URL("https://music.163.com/#/song?id=150524");
        HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
        InputStream is=urlConnection.getInputStream();
        FileOutputStream fos=new FileOutputStream("Hello.mp3");
        byte[] buffer=new byte[1024];
        int len;
        while ((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        fos.close();
        is.close();
        urlConnection.disconnect();
    }
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值