【JavaSE】网络编程2[Tomcat,UDP应用]

@[TOC]网络编程2

①.初识Tomcat

  • 服务端:
    原本—自定义 Server
    后来—Tomcat服务器 Server :Java后台开发
  • 客户端
    原来—自定义 Client
    后来—浏览器 B

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
下载地址:https://tomcat.apache.org/download-10.cgi

②.UDP消息发送

发短信:不用连接,但是要提前知道对方地址

发送消息

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

//UDP不需要链接服务器
public class UDPTalkSend01 {
    public static void main(String[] args) throws Exception {
        //1.建立一个Socket
        DatagramSocket socket = new DatagramSocket();

        //2.建立一个包,传入发送的地址以及端口
        byte[] msg = "你好服务器".getBytes(StandardCharsets.UTF_8);
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 9090;
        DatagramPacket packet = new DatagramPacket(msg,0,msg.length,address,port);

        //3.发送包
        socket.send(packet);

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

接收消息

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

//还是要等待客户端的链接
public class UDPTalkReceive {
    public static void main(String[] args) throws Exception{
        //1.开放端口
        DatagramSocket socket = new DatagramSocket(9090);

        //2.接收包数据
        byte[] receive = new byte[1024];
        DatagramPacket packet = new DatagramPacket(receive,0,receive.length);
        socket.receive(packet);  //阻塞接收
        System.out.println(new String(packet.getData()));

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

③.UDP实现聊天

循环发送消息

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

public class UdpSend01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(8888);

        //准备从控制台读取数据
        BufferedReader br = new BufferedReader(
                new InputStreamReader(System.in));

        while (true){
            byte[] data = br.readLine().getBytes();  //读取一行,存为数组
            DatagramPacket packet = new DatagramPacket(data,0,data.length,
                    new InetSocketAddress("127.0.0.1",6666));
            socket.send(packet);
            //结束判断
            if(new String(data).equals("bye")){
                break;
            }
        }
        socket.close();
    }
}

循环接收消息

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

public class UdpReceive01 {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket(6666);
        while(true){
            //准备接收数据
            byte[] receive = new byte[1024];
            DatagramPacket packet = new DatagramPacket(receive,0,receive.length);
            socket.receive(packet);  //阻塞式接收

            //断开判断
            String msg = new String(packet.getData(),0, packet.getLength());
            System.out.println(msg);
            if (msg.equals("bye")){
                break;
            }
        }
        socket.close();
    }
}

③.UDP多线程在线咨询

发送线程

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 br = null;

    private String userName;
    private int toPort;
    private String toIP;

//构造器,初始化参数,获取Socket
    public TalkSend(String userName, int toPort, String toIP) {
        this.userName = userName;
        this.toPort = toPort;
        this.toIP = toIP;
        try{
            socket = new DatagramSocket();
            br = new BufferedReader(new InputStreamReader(System.in));
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try{
            while (true){
                String msg = this.userName +":" +  br.readLine();
                byte[] data = msg.getBytes();  //读取一行,存为数组
                DatagramPacket packet = new DatagramPacket(data,0,data.length,
                        new InetSocketAddress(this.toIP,this.toPort));
                socket.send(packet);
                //结束判断
                if(new String(data).equals("bye")){
                    break;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        socket.close();
    }
}

接收线程

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

public class TalkReceive implements Runnable{
    DatagramSocket socket = null;

    private String userName;
    private int localPort;

    public TalkReceive(String userName, int localPort) {
        this.userName = userName;
        this.localPort = localPort;

        try{
            socket = new DatagramSocket(this.localPort);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try{
            while(true){
                //准备接收数据
                byte[] receive = new byte[1024];
                DatagramPacket packet = new DatagramPacket(receive,0,receive.length);
                socket.receive(packet);  //阻塞式接收

                //断开判断
                String msg = new String(packet.getData(),0, packet.getLength());
                System.out.println(msg);
                if (msg.contains("bye")){
                    break;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        socket.close();
    }
}

调用线程的两个实例

public class User1 {
    public static void main(String[] args) {
        TalkSend send = new TalkSend("iFinder",8080,"127.0.0.1");
        TalkReceive receive = new TalkReceive("iFinder",9090);

        new Thread(send).start();
        new Thread(receive).start();
    }
}
public class User2 {
    public static void main(String[] args) {
        new Thread(new TalkSend("Tom",9090,"127.0.0.1")).start();
        new Thread(new TalkReceive("Tom",8080)).start();
    }
}

④.URL下载网络资源

URL:统一资源定位符,用于定位互联网上的某一个资源

  • 组成部分:
    协议:http:// ftp://
    IP地址/域名
    端口号
    具体资源

协议 : // ip地址 : 端口 / 项目名 / 资源 / …

package com.NetLearning;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

public class URLDown {
    public static void main(String[] args) throws Exception {
        //1.网络资源地址
        URL url = new URL("https://m.mp3.1155.net/12345.m4a");

        //2.连接到这个资源 HTTP
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        InputStream inputStream = connection.getInputStream();
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("down.m4a"));
        int temp;
        while((temp = inputStream.read()) != -1){
            bos.write(temp);
        }

        //关闭资源
        bos.close();
        inputStream.close();
        connection.disconnect();  //断开连接
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值