socket网络编程简单学习


title: socket网络编程
date: 2019-07-21 19:37:33
categories:

  • java基础
    tags:

1. socket编程

1.1. 面向TCP的网络编程

今天学完socket编程, 发现其实java中的socket编程是非常简单的, 当然今天只接触了本地通信, 没有涉及到远端通信的问题. 不知道会不会牵扯到更多的东西. 其实只要把步骤理解清楚, 是非常容易的. 今天也没有接触到更深的关于tcp的东西, 所以学起来很简单. 主要记录的也是编程的一些步骤, 具体查阅API即可.

  1. 【服务端】启动,创建ServerSocket对象,等待连接。
  2. 【客户端】启动,创建Socket对象,请求连接。
  3. 【服务端】接收连接,调用accept方法,并返回一个Socket对象。
  4. 【客户端】Socket对象,获取OutputStream,向服务端写出数据。
  5. 【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。
  6. 【服务端】Socket对象,获取OutputStream,向客户端回写数据。
  7. 【客户端】Scoket对象,获取InputStream,解析回写数据。
  8. 【客户端】释放资源,断开连接。

1.2. 简单的本地通信

为了方便, 在这里把客户端服务端写到了一起, 两个线程启用.

package javaBase.socket;

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

/**
 * @author jhmarryme.cn
 * @date 2019/7/21 20:01
 */
public class TcpCommunication {

    static int count = 0;

    public static void main(String[] args) {



        //创建服务端线程
        new Thread(() -> {
            System.out.print(++count);
            System.out.println("服务器正在启动, 等待连接中");

            try {
                //1. 创建serverSocket对象, 等待连接
                ServerSocket serverSocket = new ServerSocket(6666);
                //2. 连接成功, 返回Socket对象
                Socket accept = serverSocket.accept();
                //3. 通过连接的socket获取输入流
                InputStream inputStream = accept.getInputStream();
                //4. 解析输入流中数据
                byte[] b = new byte[1024];
                final int len = inputStream.read(b);
                System.out.print(++count);
                System.out.println(new String(b, 0, len));

                //5. 通过socket获取输出流
                final OutputStream outputStream = accept.getOutputStream();
                //6. 发送数据到客户端
                System.out.print(++count);
                outputStream.write("这是服务端发送的数据".getBytes());

                outputStream.close();
                inputStream.close();
                serverSocket.close();

            } catch (Exception e){
                e.printStackTrace();
            }

        }).start();

        //创建客户端线程

        new Thread(() -> {

            try{
                System.out.print(++count);
                System.out.println("客户端启动成功");
                //1. 创建socket连接
                Socket socket = new Socket("localhost", 6666);
                //2. 获取输出流
                final OutputStream outputStream = socket.getOutputStream();
                //3. 发出数据
                System.out.print(++count);
                outputStream.write("这是客户端发送的数据: hello".getBytes());
                //4. 获取输入流
                final InputStream inputStream = socket.getInputStream();
                //5. 显示接受到的数据
                byte[] bytes = new byte[1024];
                final int len = inputStream.read(bytes);
                System.out.print(++count);
                System.out.println(new String(bytes, 0, len));

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

            } catch (Exception e){
                e.printStackTrace();
            }
        }).start();
    }
}

1.3. 简单的文件上传

  1. 【客户端】输入流,从硬盘读取文件数据到程序中。
  2. 【客户端】输出流,写出文件数据到服务端。
  3. 【服务端】输入流,读取文件数据到服务端程序。
  4. 【服务端】输出流,写出文件数据到服务器硬盘中。
  1. 客户端实现
package javaBase.socket.fileUpload;

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


/**
 * @author jhmarryme.cn
 * @date 2019/7/21 20:34
 */
public class FileUploadClient {
    public static void main(String[] args) throws IOException {
        
        //1. 连接服务器
        final Socket socket = new Socket("localhost", 6666);

        //2. 发送文件
        //2.1 读取本地文件
        final BufferedInputStream localBufferedIn = new BufferedInputStream(
                new FileInputStream("C:\\Users\\jhmarryme\\Downloads\\未命名文件.png")
        );
        //2.2 创建远程输出流
        final BufferedOutputStream remoteBufferedOut = new BufferedOutputStream(socket.getOutputStream());

        //2.3 缓冲区
        int len = -1;
        byte[] bytes = new byte[8 * 1024];
        //2.4 上传到服务器
        while ( (len = localBufferedIn.read(bytes)) != -1 ){
            remoteBufferedOut.write(bytes, 0, len);
//            remoteBufferedOut.flush(); // 采用关闭输出流的方式通知服务端, 因此不需要这个了
        }

        socket.shutdownOutput();
        System.out.println("文件发送完毕");
        //接收来自服务端的信息
        final InputStream remoteIn = socket.getInputStream();
        byte[] back = new byte[100];

        remoteIn.read(back);
        System.out.println(new String(back));
        remoteIn.close();

        //释放资源
        socket.close();
        localBufferedIn.close();

    }
}

  1. 服务端实现
package javaBase.socket.fileUpload;

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

/**
 * @author jhmarryme.cn
 * @date 2019/7/21 20:34
 */
public class FileUploadServer {

    public static void main(String[] args) throws IOException {
//1. 创建服务器, 等待连接
        final ServerSocket serverSocket = new ServerSocket(6666);

        String parent = "D:\\develop\\folderForDevelop\\";
        while (true){
            //2. 连接成功
            final Socket accept = serverSocket.accept();
            // 如果连接成功的话会继续进行.
            new Thread(() -> {

                try (
                        //3.1 获取远程输入流
                        BufferedInputStream in = new BufferedInputStream(accept.getInputStream());
                        //3.2 获取本地输出流
                        final BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(parent + System.currentTimeMillis() + ".txt")));

                ){

                    //4. 保存文件到本地
                    //4.1 缓冲区
                    byte[] bytes = new byte[1024 * 8];
                    int len = -1;
                    //4.2 保存
                    while( (len = in.read(bytes)) != -1 ){
                        out.write(bytes, 0, len);
                    }

                    //5. 回写数据
                    final OutputStream remoteOut = accept.getOutputStream();
                    remoteOut.write("上传成功".getBytes());

                    //关闭资源
                    accept.close();
                    remoteOut.close();
                    System.out.println("文件已保存");
                } catch (Exception e){
                    e.printStackTrace();
                }
            }).start();

        }
    }
}

2. 总结

重点就是分清步骤, 其实总体来说很简单.
今天接触的知识比较浅, 没有做更深入的学习, 等以后学习了再进行补充.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面中可以对界面中显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面中查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
基于hal库的OLED显示屏驱动C语言实现源码.zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip基于hal库的OLED显示屏驱动C语言实现源码.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值