第三周学习java之Socket网络编程(一篇文章解决新人对程序通信的疑惑)。

1.实现传输文件

在计算机网络的学习中,我们知道在进程之间网络是通过TCP/IP协议实现的,下面我将以简单的文件传输的例子,教初学者如何用简单的TCP/UDP实现进程网络通信。
首先是Socket的介绍大家可以自行百度or听我的简单理解,我们在计算机网络中知道,进程之间网络通信是IP地址加端口号。而Sokect我的简单理解是河流之间的两个码头,端口号标记了码头,而IP地址是地点。

客户服务器模型

客户服务器模型是我希望读者朋友提前了解的预备知识,通俗易懂的讲,我们打开微信输入账号密码点击登陆后,客户机向服务器发送一个请求,微信那边服务器一直在监听特定的端口号,点击登陆后 便建立了连接。你可以与微信上的朋友和其他用户进行通信,可以传送文件。这就是简单的客户服务器模型介绍,

文件的输入输出流

这里不便简单介绍 没有基础的小伙伴看这个
在这里插入图片描述
输入输出流简单的介绍

代码块分析(服务器端)

在这里插入图片描述

我们一条线一条线的实现,从无到有的过程。
首先第一步创建服务器

   ServerSocket serverSocket=new ServerSocket(9997);//1.创建服务器监听窗口
        Socket socket=new Socket();//2创建Socket
        System.out.print("服务器正在监听");

创建服务器,Socket。
2.第二步 在端口号监听

    socket=serverSocket.accept();//3。监听到的返回给socket
System.out.print("连接成功");

3.第三步完成图中的黄色箭头读取客户端发送的消息并且保存字符串中,再生成,文件路径文件路径可以改

     InputStream inputStream=socket.getInputStream();//获得那个流
        byte[]arr=new byte[1024];//读到里面
        int len=0;
        String downFilename="";
     while((len=inputStream.read(arr))!=-1)//4.读取要的文件名字
        {
            downFilename=downFilename+new String(arr,0,len);

        }
     String filename="";
     if("dym2.jpg".equals(downFilename))
     {
         filename="src\\dym2.jpg";
     }

第四步把服务器端本地的文件读入

  BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream(filename));//5.读文件流
     byte arr2[]=Tool.readbyte(bufferedInputStream);//6.文件转换成Byte

第五步读取的本地文件写给客户端绿色箭头

 OutputStream outputStream=socket.getOutputStream();//7.准备写文件.写文件流
        outputStream.write(arr2);//8.输出写回

第六步关闭Socket和相关文件输入输出流

    socket.shutdownOutput();
//==========关闭流
        inputStream.close();
        bufferedInputStream.close();
        outputStream.close();
        serverSocket.close();
        socket.close();

这里还需要用到工具包,把读取的转换成字节数组保存

  public static  byte[]readbyte(InputStream is)throws Exception
    {
        ByteArrayOutputStream bos=new ByteArrayOutputStream();
        byte[]b=new byte[1024];
        int len;
        while((len=is.read(b))!=-1)
            bos.write(b,0,len);
        byte[]array=bos.toByteArray();
        bos.close();
        return array;
    }

服务器端总代码

package TCP文件下载;

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

public class Serve {
    public static void main(String[] args) throws Exception{
        ServerSocket serverSocket=new ServerSocket(9997);//1.创建服务器监听窗口
        Socket socket=new Socket();//2创建Socket
        System.out.print("服务器正在监听");
        socket=serverSocket.accept();//3。监听到的返回给socket
System.out.print("连接成功");
        InputStream inputStream=socket.getInputStream();//获得那个流
        byte[]arr=new byte[1024];//读到里面
        int len=0;
        String downFilename="";
     while((len=inputStream.read(arr))!=-1)//4.读取要的文件名字
        {
            downFilename=downFilename+new String(arr,0,len);

        }
     String filename="";
     if("dym2.jpg".equals(downFilename))
     {
         filename="src\\dym2.jpg";
     }
        BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream(filename));//5.读文件流
     byte arr2[]=Tool.readbyte(bufferedInputStream);//6.文件转换成Byte
        OutputStream outputStream=socket.getOutputStream();//7.准备写文件.写文件流
        outputStream.write(arr2);//8.输出写回
        socket.shutdownOutput();
//==========关闭流
        inputStream.close();
        bufferedInputStream.close();
        outputStream.close();
        serverSocket.close();
        socket.close();

    }
}

客户端

package TCP文件下载;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket(InetAddress.getLocalHost(), 9997);
        System.out.print("输入要下载的文件名字");
        Scanner myscanner=new Scanner(System.in);
        String s=myscanner.next();
        byte[]b=new byte[1024];
        b=s.getBytes();
        OutputStream outputStream=socket.getOutputStream();
        outputStream.write(b);
        socket.shutdownOutput();
        //=========写入要传送什么文件

        InputStream inputStream=socket.getInputStream();//获取服务器发来的图片
        byte[]b2= Tool.readbyte(inputStream);//图片保存成字节数组
        BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(new FileOutputStream("D:\\dym2.jpg"));
        bufferedOutputStream.write(b2);

        //写进去 保存  准备关闭流
        outputStream.close();
        inputStream.close();
        bufferedOutputStream.close();
        socket.close();
System.out.print("客户端下载完毕");

    }
}

内网与外网。

注意这里的通信指的是同一个局域网举例子就是
你在你大学宿舍,你女同学在另一个大学,实现通信是无法实现的,要实现跨局域网通信就需要云服务器了。
关于局域网和广域网,以及如何实现跨局域网通信

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不说再见qwq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值