java网络编程(TCP、UDP和网络资源下载)

44 篇文章 0 订阅
2 篇文章 0 订阅

一、TCP

1.简单代码实例

实现客户端向服务器端发送文件
服务器端:

package com.hkd.server;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class MyServer {
    public static void main(String[] args) {
        //创建服务
        try {
            ServerSocket ss=new ServerSocket(9999);
            System.out.println("服务端开启了");
            Socket s=ss.accept();
            System.out.println("客户端连接上了");
            InputStream is=s.getInputStream();
            FileOutputStream fos=new FileOutputStream(new File("copy.png"));
            byte[] buffer=new byte[1024];
            int len;
            while ((len=is.read(buffer))!=-1){
                fos.write(buffer,0,len);
            }
            System.out.println("服务端接受完了");

            //通知客户端我们接受完毕了
            OutputStream os=s.getOutputStream();
            os.write("我已经接受完毕了,你可以断开了".getBytes(StandardCharsets.UTF_8));

            fos.close();
            is.close();
            s.close();
            ss.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端

package com.hkd.server;

import java.io.*;
import java.net.Socket;

public class MyClient {
    public static void main(String[] args) {
        //创建一个socket连接
        try {
            Socket s=new Socket("localhost",9999);
            //2.创建一个输出流
            OutputStream os=s.getOutputStream();
            //读取文件
            FileInputStream fis=new FileInputStream(new File("D:\\大三下学期java学习\\实训\\test\\1.png"));

            //读出文件
            byte [] buffer=new byte[1024];
            int len;
            while ((len=fis.read(buffer))!=-1){
                os.write(buffer,0,len);
            }
            s.shutdownOutput();
            System.out.println("客户端发送完l");

            //确认服务器接受文件后,才能断开连接
            InputStream inputStream=s.getInputStream();
            ByteArrayOutputStream baos=new ByteArrayOutputStream();

            byte[] buffer2=new byte[1024];
            int len2;
            while ((len2=inputStream.read(buffer2))!=-1){
                baos.write(buffer2,0,len2);
            }
            System.out.println(baos.toString());
            baos.close();
            inputStream.close();
            fis.close();
            os.close();
            s.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.实现客户端向服务器端发送实体类,并接受返回信息

由于是两个项目,就通过文件展示了

资源挂着这里了

二.UDP

原理:发短信:不用连接,需要知道对方的地址


1.发送消息

  • 一方是发送端,一方是接收端

实现代码如下:

发送端:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;

public class UdpSendDemo1 {

    public static void main(String[] args) throws Exception {


        DatagramSocket socket=new DatagramSocket(8888);

        //准备数据 system.in
        BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(System.in));

        while (true){
        String data=bufferedReader.readLine();
        byte[] datas=data.getBytes(StandardCharsets.UTF_8);

        DatagramPacket packet=new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666));
        socket.send(packet);
        if (data.equals("bye")){
            System.out.println("你选择了退出");
            break;
        }

    }
        socket.close();
    }

}

接收端:

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

public class UdpReceiveDemo1 {
    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);//阻塞式接受包裹

            //断开连接 bye
            byte[] data= packet.getData();
            String receiveData= new String(data,0,data.length);

            //输出接受到的数据
            System.out.println(receiveData.trim());

            //判断结束到的数据是bye吗,如果是就结束循环,结束程序
            if (receiveData.trim().equals("bye")){
                break;
            }
        }
        socket.close();
    }
}

2.在线咨询

  • 两个人都可以是发送方,也可以是接收方
TalkReceive工具类
package com.hkd.chat;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TalkReceive implements Runnable {

    DatagramSocket socket =null;
    //接受端端口号
    private int port;
    //来自谁的信息
    private String msgFrom;
    private SimpleDateFormat sdf=new SimpleDateFormat("hh:mm:ss");

    public TalkReceive(int port,String msgFrom) {
        this.port = port;
        this.msgFrom=msgFrom;
        try {
            socket=new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        while (true) {
        try {

                //准备接受包裹
                byte[] container = new byte[2048];
                DatagramPacket packet = new DatagramPacket(container, 0, container.length);
                socket.receive(packet);//阻塞式接受包裹

                //断开连接 bye
                byte[] data= packet.getData();
                String receiveData= new String(data,0,data.length);

                //输出接受信息的时间
                System.out.println("-----------"+sdf.format(new Date())+"-----------");
                //输出接受到的数据
                System.out.println(msgFrom+":"+receiveData.trim());

                //判断结束到的数据是bye吗,如果是就结束循环,结束程序
                if (receiveData.trim().equals("bye")){
                    break;
                }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
        //关闭资源
        socket.close();

    }
}

TalkSend工具类
package com.hkd.chat;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;

public class TalkSend implements Runnable {
    DatagramSocket socket=null;
    BufferedReader bufferedReader=null;
    //来自本机的那个端口
    private int fromPort;

    //接收端的ip和端口号
    private String toIp;
    private int toPort;

    public TalkSend(int fromPort, String toIp, int toPort) {
        this.fromPort = fromPort;
        this.toIp = toIp;
        this.toPort = toPort;
        try {
            socket = new DatagramSocket(fromPort);
            bufferedReader=new BufferedReader(new InputStreamReader(System.in));
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true){
            try {
                String data=bufferedReader.readLine();
                byte[] datas=data.getBytes(StandardCharsets.UTF_8);

                DatagramPacket packet=new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIp,this.toPort));
                socket.send(packet);
                if (data.equals("bye")){
                    System.out.println("你选择了退出");
                    break;
                }
            }
            catch (Exception e){
                e.printStackTrace();
            }


        }
        //关闭资源
        socket.close();
    }
    }


客户端A
package com.hkd.chat;

/**
 * 用户A的客户端
 */
public class TalkA {
    public static void main(String[] args) {

        //用户A的两个线程

        //1.用户A的发送线程
        // 参数 来自用户A的7777端口号 用户B的地址 用户B的接受端口号
        new Thread(new TalkSend(7777,"localhost",9999)).start();

        //2.用户A的接收线程
        //用户A的接收端口号 来自用户B的提示信息
        new Thread(new TalkReceive(8888,"用户B")).start();
    }

}

客户端B
package com.hkd.chat;

/**
 * 用户B的客户端
 */
public class TalkB {
    public static void main(String[] args) {

        //用户B的两个线程

        //1.用户B的发送线程
        // 参数 来自用户B的5555端口号 用户A的地址 用户A的接受端口号
        new Thread(new TalkSend(5555,"localhost",8888)).start();

        //2.用户B的接收线程
        //用户B的接收端口号 来自用户A的提示信息
        new Thread(new TalkReceive(9999,"用户A")).start();
    }

}

三、URL下载网络资源

URl:统一资源文件符、定位互联网上的某一个资源

  • 协议://
  • DNS域名解析:将www.baidu.com转化为110.242.68.4ip地址的过程

了解一下URL这个类

package com.hkd.chat;

import java.net.URL;

public class URLDemo1 {

    public static void main(String[] args) throws Exception {
        URL url=new URL("http://localhost:8080/helloworld/index.jsp?username=lxl&password=123456");

        System.out.println(url.getProtocol());//协议
        System.out.println(url.getHost());//主机ip
        System.out.println(url.getPort());//主机端口
        System.out.println(url.getPath());//文件地址
        System.out.println(url.getFile());//文件全路径
        System.out.println(url.getQuery());//参数
    }
}

开始测试

测试一 下载tomcat本地服务器的资源

  • 打开tomcat,bin目录下的startup.bat,启动服务
  • 在webapps创建一个urlDemo1文件夹,在里面新建一个test1.txt文本文档
  • 然后我们在idea里面通过java的类下载下来这个文本文档
package com.hkd.chat;

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

public class URLDemo2 {

    public static void main(String[] args) throws Exception {
        //1.下载地址
        URL url=new URL("http://localhost:8080/urlDemo1/test1.txt");
        //2.连接到这个资源 HTTP
        HttpURLConnection urlConnection=(HttpURLConnection) url.openConnection();

        InputStream is=urlConnection.getInputStream();

        FileOutputStream fos=new FileOutputStream("test1.txt");

        byte[] bytes=new byte[1024];
        int len;
        while ((len=is.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }


        //关闭资源
        fos.close();
        is.close();
        urlConnection.disconnect();


    }
}

测试二 下载网络资源

我是直接下载网易云的音乐资源,当然是免费的资源才行

  • 打开网易云官网,打开审查元素的网络,点击一个歌曲播放
  • 找到.m4a文件或者其他歌曲格式文件,在新标签页打开测试能否播放
  • 可以的话,复制链接
  • 开始写java类
package com.hkd.chat;

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

public class URLDemo2 {

    public static void main(String[] args) throws Exception {
        //1.下载地址
        URL url=new URL("http://localhost:8080/urlDemo1/test1.txt");
        //2.连接到这个资源 HTTP
        HttpURLConnection urlConnection=(HttpURLConnection) url.openConnection();

        InputStream is=urlConnection.getInputStream();

        FileOutputStream fos=new FileOutputStream("test1.txt");

        byte[] bytes=new byte[1024];
        int len;
        while ((len=is.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }


        //关闭资源
        fos.close();
        is.close();
        urlConnection.disconnect();


    }
}

发现已经下载下来了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小吕努力变强

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

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

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

打赏作者

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

抵扣说明:

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

余额充值