栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 网络编程,实时聊天,网络资源的爬取,文件上传

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 网络编程,实时聊天,网络资源的爬取,文件上传

文章目录
  • java 网络编程学习笔记
    • 1、ip地址
    • 2、端口
    • 3、服务器与客户端连接(TCP)
    • 4、服务器与客户端之文件传输(TCP)
    • 5、UDP信息传输
    • 6、UDP实现在线聊天
    • 7、URL资源定位

java 网络编程学习笔记 1、ip地址

​ IP地址用于定位一台网络唯一的计算机。

InetAddress类:用于网络上一台计算机的相关信息。

InetAddress inetAddress = InetAddress.getByName("www.yujiangg.com");
// 获取ip的一个字节数组
System.out.println(inetAddress.getAddress());
// 返回主机的公网ip地址
System.out.println(inetAddress.getHostAddress());
// 返回主机的规范名臣的,相当于ip
System.out.println(inetAddress.getCanonicalHostName());
// 获取主机的域名
System.out.println(inetAddress.getHostName());
2、端口

​ 表示计算机上一个程序的进程,不同的进程有不同的端口号,单个协议下端口号不能冲突,用于区分软件,0~65535个端口。

  • 公有端口(0~1023):这个端口是会被内置的程序使用,一般不能使用这些端口。
  • 注册端口(1024~49151):这些端口就是提供给用户使用的,表示程序。
  • 动态端口(后面的端口):也不要使用这里面的端口号。

查看端口号命令:

netstat -ano # 查询所有端口
netstat -ano|findstr "端口号"  # 查看指定端口
tasklist|findstr "端口号" # 查看这个端口号下的程序
// 第一个参数是主机名,第二个参数是端口号
InetSocketAddress inetSocketAddress = new InetSocketAddress("www.yujiangg.com", 8080);
// 获取ip的一个字节数组
System.out.println(inetAddress.getAddress());
// 获取主机名
System.out.println(inetSocketAddress.getHostName());
// 获取端口号
System.out.println(inetSocketAddress.getPort());
3、服务器与客户端连接(TCP)

服务器端:

package com.tanke.demo01;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        // 服务器接收信息
        try (
            // 创建一个服务器
            ServerSocket serverSocket = new ServerSocket(9999);
            // 监听客户端的连接
            Socket socket = serverSocket.accept();
            // 接收信息
            InputStream inputStream = socket.getInputStream();
            // 管道流,过滤信息,解决乱码问题
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ){
            // 接收信息
            byte[] buffer = new byte[1024];
            int len = -1;
            while((len=inputStream.read(buffer)) != -1){
                baos.write(buffer,0,len);
            }
            // 将接收到的信息输出
            System.out.println(baos.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端:

package com.tanke.demo01;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
    public static void main(String[] args) throws UnknownHostException {
        // 服务器的ip
        InetAddress inetAddress =  InetAddress.getByName("127.0.0.1");
        // 端口号
        int port = 9999;
        try (
            // 服务器连接
            Socket socket = new Socket(inetAddress,port);
            OutputStream outputStream = socket.getOutputStream();
        ){
            String msg = "你好,服务器!";
            // 通过io流向服务器发送信息
            outputStream.write(msg.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4、服务器与客户端之文件传输(TCP)

服务器端:

package com.tanke.demo01;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerFile {
    public static void main(String[] args) {
        try (
            ServerSocket serverSocket = new ServerSocket(9000);
            Socket socket = serverSocket.accept();
            InputStream inputStream = socket.getInputStream();
            FileOutputStream fileOutputStream = new FileOutputStream(new File("receive.jpg"));
        ){
            // 将传输的文件写入
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len=inputStream.read(buffer)) != -1){
                fileOutputStream.write(buffer);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端:

package com.tanke.demo01;

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

public class ClientFile {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        int port = 9000;
        try (
            Socket socket = new Socket(inetAddress, port);
            OutputStream outputStream = socket.getOutputStream();
            // 读入文件流
            FileInputStream fileInputStream = new FileInputStream(new File("photo.jpg"));
        ){
            // 将字节流传输给服务器
            byte[] buffer = new byte[1024];
            int len = -1;
            while ((len=fileInputStream.read(buffer)) != -1){
                outputStream.write(buffer);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5、UDP信息传输

​ UDP是不需要连接,是直接发送数据报给某个用户,是不需要连接服务器的,类似QQ、微信等。

发送端:

package com.tanke.demo02;

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

public class ClientUDP1 {

    public static void main(String[] args) {

        try (
            // 建立一个socket
            DatagramSocket datagramSocket = new DatagramSocket();
        ){
            // 接收的人
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            int port = 9999;
            // 发送的消息
            String msg = "你好";
            byte[] buffer = msg.getBytes();

            // 创建一个数据报
            
            DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length, inetAddress, port);

            // 发送数据报
            datagramSocket.send(datagramPacket);
            System.out.println("发送成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

接收端:

package com.tanke.demo02;

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

public class ClientUDP2 {
    public static void main(String[] args) {

        try (
            // 开放端口号
            DatagramSocket datagramSocket = new DatagramSocket(9999);

        ){
            // 接收数据包,准备一个接收的空间
            byte[] buffer = new byte[1024];
            // 创建一个数据报,用于封装接收到的数据
            DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
            // 阻塞接收
            datagramSocket.receive(datagramPacket);
            // datagramPacket中封装了发送的基本信息,发送者的地址及数据报
            // 接收到数据,是一个字节数组
            byte[] data = datagramPacket.getData();
            // 发送者的地址
            InetAddress inetAddress = datagramPacket.getAddress();
            // datagramPacket.getPort(); // 端口号

            // 将字节数组转换成字符串时,需要指定数据报的长度,不然会将空余空间也会输出
            System.out.println(new String(data,0,datagramPacket.getLength()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
6、UDP实现在线聊天

发送线程:

package com.tanke.demo03;

import java.net.*;
import java.util.Scanner;


public class TalkSend implements Runnable{

    DatagramSocket datagramSocket = null;
    Scanner in = null;

    // 发送者的端口号
    private int fromPort;
    // 接收者的地址
    private String toIP;
    // 接收者的接收端口
    private  int toPort;

    public TalkSend(int fromPort, String toIP, int toPort) {
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;
        // 进行初始化
        try {
            datagramSocket = new DatagramSocket(this.fromPort);
            in = new Scanner(System.in);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try{
            while (true){
                // 发送的消息
                String msg = in.nextLine();
                byte[] buffer = msg.getBytes();
                DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length, new InetSocketAddress(this.toIP,this.toPort));
                // 发送数据报
                datagramSocket.send(datagramPacket);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

接收线程:

package com.tanke.demo03;

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


public class TalkReceive implements Runnable{

    DatagramSocket datagramSocket = null;
    // 接收端口
    private int port;
    // 发送者的姓名
    private String msgName;

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

    @Override
    public void run() {
        try {
            while (true){
                byte[] buffer = new byte[1024];
                DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
                datagramSocket.receive(datagramPacket);
                byte[] data = datagramPacket.getData();
                // 将字节数组转换成字符串时,需要指定数据报的长度,不然会将空余空间也会输出
                System.out.println(msgName+":"+new String(data,0,datagramPacket.getLength()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

学生端:

package com.tanke.demo03;


public class Student {
    public static void main(String[] args) {
        // 发送线程,从8888端口发给9999端口的127.0.0.1
        new Thread(new TalkSend(8888,"127.0.0.1",9999)).start();
        // 接收端,从7777端口接收数据,来之老师的消息
        new Thread(new TalkReceive(7777,"老师")).start();
    }

}

老师端:

package com.tanke.demo03;

public class Teacher {
    public static void main(String[] args) {

        // 发送线程,从6666端口发给7777端口的127.0.0.1
        new Thread(new TalkSend(6666,"127.0.0.1",7777)).start();
        // 接收线程,从9999端口接收学生发送的消息
        new Thread(new TalkReceive(9999,"学生")).start();
    }
}
7、URL资源定位

URL:

URL url = new URL("http://www.yujiangg.com:80/index.jsp?userName=admin");
System.out.println(url.getProtocol()); // 协议
System.out.println(url.getPort()); // 端口号
System.out.println(url.getHost()); // 主机ip
System.out.println(url.getPath()); // 文件路径
System.out.println(url.getFile()); // url全路径,包括参数
System.out.println(url.getQuery()); // 参数

爬取网络资源:

package com.tanke.demo04;

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

public class UrlConnectionTest {
    public static void main(String[] args) throws Exception {
        // 网络地址
        String urlString = "https://m801.music.126.net/20211107134948/91205dd7d7276dd4571713eefb28b6cb/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/11518403401/53d9/3013/dc76/928a32f8a24746e235218c01c2cf3de4.m4a";
        URL url = new URL(urlString);
        // 建立连接
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream outputStream = new FileOutputStream("mp4Test.m4a");
        // 下载资源
        byte[] buffer = new byte[1024];
        int len = -1;
        while((len=inputStream.read(buffer)) != -1){
            outputStream.write(buffer,0,len);
        }
        // 关闭资源和连接
        outputStream.close();
        inputStream.close();
        urlConnection.disconnect();
    }
}

tream inputStream = urlConnection.getInputStream();
FileOutputStream outputStream = new FileOutputStream(“mp4Test.m4a”);
// 下载资源
byte[] buffer = new byte[1024];
int len = -1;
while((len=inputStream.read(buffer)) != -1){
outputStream.write(buffer,0,len);
}
// 关闭资源和连接
outputStream.close();
inputStream.close();
urlConnection.disconnect();
}
}















































转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/444843.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号