Java网络编程Socket

Java网络编程Socket

Java网络多线程

2022年8月31日

笔记 韩顺平Java自学笔记 网络多线程_关注永雏塔菲喵的博客-CSDN博客

网课 【韩顺平讲Java】Java网络多线程专题 – TCP UDP Socket编程 多线程 并发处理 文件传输 新闻推送 Java_哔哩哔哩_bilibili

通信项目上传到github:cxy-sky/JavaSocket: Java 网络多线程专题,包括 TCP UDP Socket编程 多线程 并发处理 文件传输 新闻推送 (github.com)
2022年9月7日完结

InetAddress

package com.jiao;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Main {

    public static void main(String[] args) throws UnknownHostException {
//       获得本机的InetAddress对象
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost);
//      根据指定的主机名获得InetAddress对象
        InetAddress byName = InetAddress.getByName("sky");
        System.out.println(byName);
//      根据域名返回对应的ip
        InetAddress byName1 = InetAddress.getByName("www.baidu.com");
        System.out.println(byName1);
//      通过getHostAddress对象使他获得对应的地址ipv4地址
        String hostAddress = byName1.getHostAddress();
        System.out.println(hostAddress);
//      获取对应的域名
        String hostName = byName1.getHostName();
        System.out.println(hostName);
    }
}

Socket

简介

请添加图片描述

理解

请添加图片描述

TCP网络通信

简介

请添加图片描述

案例1 字节流

服务端

package com.jiao.socket.tcp01;

import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * auth:@highSky
 * create:2022/8/31
 * email:zgt9321@qq.com
 **/
public class Server {

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

//        要求电脑上没有其他程序在监听9999接口
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器在9999端口进行监听");
        //程序阻塞,不再向下执行  如果有客户端socket链接,返回一个socket链接,开始向下执行
        Socket socket = serverSocket.accept();
        System.out.println("客户端 socket = "+socket.getClass());
//      客户端没有发送消息的话,会堵塞在这里
        InputStream inputStream = socket.getInputStream();
        byte[] msg = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(msg)) != -1) {
            System.out.println("收到消息: " + socket.getLocalAddress().getHostName() + " " + new String(msg, 0, len));
        }
        inputStream.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务关闭");
    }

}

客户端

package com.jiao.socket.tcp01;

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

/**
 * auth:@highSky
 * create:2022/8/31
 * email:zgt9321@qq.com
 **/
public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
        System.out.println("正在发送消息");
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello jiaojiao".getBytes());
        //发送完成结束标记
        socket.shutdownOutput();
        System.out.println("消息发送完成");
        outputStream.close();
        socket.close();
    }
}

案例2 互发消息

server

package com.jiao.socket.tcp02;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * auth:@highSky
 * create:2022/8/31
 * email:zgt9321@qq.com
 **/
public class Server {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("server" + InetAddress.getLocalHost().getHostAddress() + "正在监听");
        Socket socket = serverSocket.accept();
        InputStream inputStream = socket.getInputStream();
        byte[] msg = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(msg)) != -1) {
            System.out.println("收到消息: " + socket.getLocalAddress().getHostName() + " " + new String(msg, 0, len));
        }
        
		//给client发送消息
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello tiantian".getBytes());
        //发送完成结束标记
        socket.shutdownOutput();

        outputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务关闭");
    }

}

client

package com.jiao.socket.tcp02;

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

/**
 * auth:@highSky
 * create:2022/8/31
 * email:zgt9321@qq.com
 **/
public class Client {
    public static void main(String[] args) throws IOException {
//        Socket socket = new Socket("106.14.219.106", 9999);
        Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
        System.out.println("正在发送消息");
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello jiaojiao".getBytes());
        //发送完成结束标记
        socket.shutdownOutput();
        System.out.println("消息发送完成");

        //接收服务端发来的消息
        InputStream inputStream = socket.getInputStream();
        byte[] msg = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(msg)) != -1) {
            System.out.println(new String(msg, 0, len));
        }

        inputStream.close();
        outputStream.close();
        socket.close();
    }
}

案例3 字节流

使用writer时,写入数据后,要调用flush刷新

//input字节流转换为reader字符流
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
//output字节流转换为writer字符流
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
package com.jiao.socket.tcp03;

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

/**
 * auth:@highSky
 * create:2022/8/31
 * email:zgt9321@qq.com
 **/
public class Server {

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

        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("server" + InetAddress.getLocalHost().getHostAddress() + "正在监听");
        Socket socket = serverSocket.accept();
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String msg = bufferedReader.readLine();
        System.out.println("server 收到消息: " + socket.getLocalAddress().getHostName() + " " + msg);

        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello tiantian");
        bufferedWriter.newLine();
        bufferedWriter.flush();

        bufferedWriter.close();
        bufferedReader.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务关闭");
    }

}

客户端

package com.jiao.socket.tcp03;

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

/**
 * auth:@highSky
 * create:2022/8/31
 * email:zgt9321@qq.com
 **/
public class Client {
    public static void main(String[] args) throws IOException {
//        Socket socket = new Socket("106.14.219.106", 9999);
        Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
        System.out.println("正在发送消息");
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello jiaojiao");
        bufferedWriter.newLine();
        bufferedWriter.flush();
        System.out.println("消息发送完成");

        //接收服务端发来的消息
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String msg = bufferedReader.readLine();
        System.out.println("client 收到消息: " + socket.getLocalAddress().getHostName() + " " + msg);

        bufferedReader.close();
        bufferedWriter.close();
        socket.close();
    }
}

上传文件

img

工具类

package com.jiao.upload;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
 * auth:@highSky
 * create:2022/9/1
 * email:zgt9321@qq.com
 **/

public class StreamUtils {
    public static byte[] streamToByteArray(InputStream is) throws Exception {
        // 创建输出流对象
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        // 字节数组
        byte[] b = new byte[1024];
        int len;
        while ((len = is.read(b)) != -1) {
            // 循环读取
            // 把读取到的数据,写入 bos
            bos.write(b, 0, len);
        }
        byte[] array = bos.toByteArray();
        bos.close();
        return array;
    }

    public static String streamToString(InputStream is) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder builder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            builder.append(line + "
");
        }
        return builder.toString();
    }
}

server

package com.jiao.upload;

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

/**
 * auth:@highSky
 * create:2022/9/1
 * email:zgt9321@qq.com
 **/
public class Server {

    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("》》服务开启,等待连接,发送图片");
        //得到连接
        Socket socket = serverSocket.accept();
        //准备图片
        String imgName = "src/com/jiao/upload/jiaojiao.png";
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(imgName));
        //将图片保存为byte数组中
        byte[] img = StreamUtils.streamToByteArray(bis);
        //获取socket的输出流
        OutputStream outputStream = socket.getOutputStream();
        //转换为缓存输出流
        BufferedOutputStream bos = new BufferedOutputStream(outputStream);
        bos.write(img);
        System.out.println("》》图片发送完成");
        socket.shutdownOutput();

        //客户端收到图片后的反馈信息
        InputStream inputStream = socket.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        System.out.println(reader.readLine());
        bos.close();
        bis.close();
        reader.close();
        socket.close();

    }

}

client

package com.jiao.upload;

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

/**
 * auth:@highSky
 * create:2022/9/1
 * email:zgt9321@qq.com
 **/
public class Client {

    public static void main(String[] args) throws Exception {
        Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
        System.out.println("》》等待图片");

        //获取socket接收到的二进制图片数据
        InputStream inputStream = socket.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(inputStream);
        byte[] img = StreamUtils.streamToByteArray(bis);

        //保存到本地
        String imgName = "src/com/jiao/upload/tiantian.png";
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(imgName));
        bos.write(img);
        System.out.println("》》保存完成");


        //给服务端发送接受完成信息
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        writer.write(InetAddress.getLocalHost().getHostName() + "已收到图片");
        writer.newLine();
        writer.flush();
        writer.close();
        bos.close();
        bis.close();
        socket.close();

    }

}

UDP

原理

请添加图片描述

user1

package com.jiao.udp;

import java.io.IOException;
import java.net.*;

/**
 * auth:@highSky
 * create:2022/9/2
 * email:zgt9321@qq.com
 **/
public class User1 {

    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(9999);
        //向user2发送消息
        byte[] bag = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9998);
        byte[] msg = "Hello jiaojiao".getBytes();
        packet.setData(msg, 0, msg.length);
        socket.send(packet);

        System.out.println("发送完成");
        System.out.println("等待user2回复");

        packet = new DatagramPacket(bag, bag.length);
        socket.receive(packet);
        msg = packet.getData();
        System.out.println(new String(msg, 0, msg.length));

        System.out.println("通信完成");
        socket.close();
    }
}

user2

package com.jiao.udp;

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

/**
 * auth:@highSky
 * create:2022/9/2
 * email:zgt9321@qq.com
 **/
public class User2 {

    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(9998);
        //接受user1的消息
        byte[] bag = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bag, bag.length);
        System.out.println("等待user1的消息");
        socket.receive(packet);
        byte[] msg = packet.getData();
        System.out.println(new String(msg, 0, msg.length));
        //回复user1
        packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9999);
        msg = "hello tiantian".getBytes();
        packet.setData(msg, 0, msg.length);
        socket.send(packet);
        System.out.println("通信结束");
        socket.close();
    }
}

练习

tcp

请添加图片描述

server

package com.jiao.homework.test1;

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

/**
 * auth:@highSky
 * create:2022/9/2
 * email:zgt9321@qq.com
 **/
public class Server {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println(">>服务已开启,等待连接");
        Socket socket = serverSocket.accept();
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//        System.out.println("client:  " + reader.readLine());

        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        if ("name".equals(reader.readLine()))
            writer.write("nova");
        else
            writer.write("你说啥呢");
        writer.newLine();
        writer.flush();

        System.out.println("client:  " + reader.readLine());

        writer.write("编写java程序");
        writer.newLine();
        writer.flush();

        writer.close();
        reader.close();
        socket.close();

    }
}

client

package com.jiao.homework.test1;

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

/**
 * auth:@highSky
 * create:2022/9/2
 * email:zgt9321@qq.com
 **/
public class Client {

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
        System.out.println(">>给服务器发送消息");
        //给server发送消息
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        writer.write("name");
        writer.newLine();
        writer.flush();


        //接受回复
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//        System.out.println("server:  " + reader.readLine());
        if ("name".equals(reader.readLine()))
            writer.write("hobby");
        else
            writer.write("你说啥呢");
        writer.newLine();
        writer.flush();

        System.out.println("server:  " + reader.readLine());

        writer.close();
        reader.close();
        socket.close();

    }
}

udp

请添加图片描述

userA

package com.jiao.homework.udp;

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

/**
 * auth:@highSky
 * create:2022/9/2
 * email:zgt9321@qq.com
 **/
public class UserA {

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

        Scanner in = new Scanner(System.in);

        //发送方
        DatagramSocket socket = new DatagramSocket(9999);

        byte[] bag = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9998);
        System.out.println("请输入问题:");
        String msgS = in.nextLine();
        byte[] msgB = msgS.getBytes();
        packet.setData(msgB);
        socket.send(packet);

        packet = new DatagramPacket(bag, bag.length);
        socket.receive(packet);
        msgB = packet.getData();
        System.out.println(new String(msgB, 0, packet.getLength()));

        socket.close();
    }

}

userB

package com.jiao.homework.udp;

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

/**
 * auth:@highSky
 * create:2022/9/2
 * email:zgt9321@qq.com
 **/
public class UserB {


    public static void main(String[] args) throws IOException {
        //接受方
        DatagramSocket socket = new DatagramSocket(9998);
        byte[] bag = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bag, bag.length);
        socket.receive(packet);
        byte[] msgB = packet.getData();
        System.out.println(new String(msgB, 0, packet.getLength()));

        packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9999);
        packet.setData("四大名著为。。。。。。".getBytes());
        socket.send(packet);

        socket.close();
    }
}

文件传输

请添加图片描述

server

package com.jiao.homework.trans;

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

/**
 * auth:@highSky
 * create:2022/9/3
 * email:zgt9321@qq.com
 **/
public class Server {

    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(9999);
        //服务端等待客户端下载请求
        System.out.println("等待请求");
        Socket socket = serverSocket.accept();
        //得到socket请求
        InputStream is = socket.getInputStream();
        byte[] data = new byte[1024];
        int len = 0;
        //文件名称,这里是单线程可以用stringBuilder
        StringBuilder fileName = new StringBuilder();
        while ((len = is.read(data, 0, data.length)) != -1) {
            fileName.append(new String(data, 0, len));
        }
        System.out.println(fileName);
        BufferedInputStream bis = null;
        if ("碧蓝之海".equals(fileName.toString())) {
            fileName = new StringBuilder("src/com/jiao/homework/trans/碧蓝之海.mp3");
        } else {
            fileName = new StringBuilder("src/com/jiao/homework/trans/sorry.txt");
        }
        bis = new BufferedInputStream(new FileInputStream(fileName.toString()));
        byte[] file = StreamUtils.streamToByteArray(bis);

        //发送给客户端
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        bos.write(file);
        bos.flush();
        socket.shutdownOutput();

        bos.close();
        bis.close();
        socket.close();
        serverSocket.close();

    }
}

client

package com.jiao.homework.trans;

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

/**
 * auth:@highSky
 * create:2022/9/3
 * email:zgt9321@qq.com
 **/
public class Client {

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

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入文件名");
        String filename = scanner.nextLine();
        //给服务端发送下载文件的文件名
        Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
        OutputStream os = socket.getOutputStream();
        os.write(filename.getBytes());
        os.flush();
        socket.shutdownOutput();
        //获取返回的文件,下载
        //将文件读取到数组中
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        byte[] file = StreamUtils.streamToByteArray(bis);
        //保存到本地
        if ("碧蓝之海".equals(filename))
            filename = "E:\" + filename + ".mp3";
        else
            filename = "E:\" + filename + ".txt";

        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filename));
        bos.write(file);
        bos.flush();

        bos.close();
        bis.close();
        os.close();
        socket.close();

    }
}

StreamUtils

package com.jiao.homework.trans;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * auth:@highSky
 * create:2022/9/1
 * email:zgt9321@qq.com
 **/

public class StreamUtils {
    public static byte[] streamToByteArray(InputStream is) throws Exception {
        // 创建输出流对象
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        // 字节数组
        byte[] b = new byte[1024];
        int len;
        while ((len = is.read(b)) != -1) {
            // 循环读取
            // 把读取到的数据,写入 bos
            bos.write(b, 0, len);
        }
        byte[] array = bos.toByteArray();
        bos.close();
        return array;
    }

    public static String streamToString(InputStream is) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder builder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            builder.append(line + "
");
        }
        return builder.toString();
    }
}

项目-多用户通信请添加图片描述

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Java网络编程Socket