2020-06-23Java入门(二十六)网络编程

网络通信

* 网络编程 在一定的写一下实现两台计算机的连接

* 网络通信协议 计算机之间通信需要遵守通信协议

* tcp/IP 最基本最广泛的协议 每天都在用的 重点讲解 连接网络 需要通过这个协议获取IP地址 处理数据的通信协议

* UDP 面向无连接的通信协议 两个计算机不用连接 用于视频会议 偶尔会丢失包udp

* Tcp 三次握手 客户端 像服务器发送链接请求

*      服务器给客户端响应

*      客户端给服务器确认信息

* ip地址 0~255十进制表示 42亿个  iPv4

* ipv6可以给世界上每一粒沙子分配上IP

* cmd 命令ipconfig 可以查看IP 如果ping通ip 就可以说明可以连接

*

*      * 借助端口号  保证数据准确无误的发出 端口号两个字节组成 取值范围65535

*      * 端口号不能重复

*      * 常用端口号 80端口 网络端口号 数据库mysql 3306 tomcat8080


TCP协议

客户端/**

* 网络编程 在一定的写一下实现两台计算机的连接

* 网络通信协议 计算机之间通信需要遵守通信协议

* tcp/IP 最基本最广泛的协议 每天都在用的 重点讲解 连接网络 需要通过这个协议获取IP地址 处理数据的通信协议

* UDP 面向无连接的通信协议 两个计算机不用连接 用于视频会议 偶尔会丢失包udp

* Tcp 三次握手 客户端 像服务器发送链接请求

*      服务器给客户端响应

*      客户端给服务器确认信息

* ip地址 0~255十进制表示 42亿个  iPv4

* ipv6可以给世界上每一粒沙子分配上IP

* cmd 命令ipconfig 可以查看IP 如果ping通ip 就可以说明可以连接

*

*      * 借助端口号  保证数据准确无误的发出 端口号两个字节组成 取值范围65535

*      * 端口号不能重复

*      * 常用端口号 80端口 网络端口号 数据库mysql 3306 tomcat8080

*

*/

public class Internet {

/**

    * Tcp 面向连接的通信

    * 通信的步骤 服务器端先启动不会主动请求客户端 客户端请求服务器端 建立连接 使用io对象进行通信 字节流对象

    * 服务器使用客户端的流和客户端交互  服务器中没有流io

    * client客户端

    *

* socket (host ip) colse

*/

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

//创建socket对象 构造方法绑定IP 和端口号

        Socket socket =new Socket("127.0.0.1",8888);

// 使用对象中的方法 获取网络字节流对象

        OutputStream outputStream = socket.getOutputStream();

//使用网络细节输出流对象中的方法 给给服务器发送数据

        outputStream.write("你好服务器".getBytes());

//获取字节输入流对象

        InputStream inputStream = socket.getInputStream();

//使用字节输入流 读取字节读取的数据

        byte[] bytes =new byte[1024];

int len=inputStream.read(bytes);

System.out.println(new String(bytes,0,len));

//释放

        outputStream.close();//因为没有连接服务器 暂时报异常

        inputStream.close();

}

}


服务器 import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

/**

* 服务器TCP 带端口好的额构造方法

* 客户端 IP host

* 服务器必须要知道哪个客户端请求的服务器 可以使用accept 方法 获取请求客户端的对象

*

*/

public class Server {

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

//创建服务器 要指定的端口号

        ServerSocket serverSocket =new ServerSocket(8888);

//获取请求对象

        Socket socket = serverSocket.accept();

//读取

        InputStream inputStream = socket.getInputStream();

//读取客户端发送的数据

        byte[] bytes=new byte[1024];

int len=inputStream.read(bytes);

System.out.println(new String(bytes,0,len));

//获取网络字节输出流

        OutputStream outputStream = socket.getOutputStream();

outputStream.write("嗯".getBytes());

socket.close();

serverSocket.close();

}

}

先执行服务器 在启动客户端 实现三次握手


综合案列练习 文件上传

客户端

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.Socket;

/**

* Tcp协议

* 综合案列 文件的上传

* 其实大概的意思就是 把文件上传到服务器上 并保存在硬盘中  服务器告诉我们已经保存好 客户端给一个响应

*

*/

public class TcpScoket {

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

//首先我们需要有一个文件在本地

        //本地字节输入流对象  构造方法中要绑定读取的数据源

        FileInputStream fileInputStream =new FileInputStream("E:\\ideawork\\dianbiao.txt");

//新建一个客户端 ip host 读取文件

        Socket socket =new Socket("127.0.0.1",8888);

//获取字节输出流对象

        OutputStream outputStream = socket.getOutputStream();

System.out.println("查看一下"+outputStream);

//使用本地输入流读取文件

        int len=0;

byte[] bytes =new byte[1024];

while ((len=fileInputStream.read(bytes))!=-1){

System.out.println("bytes"+bytes);

//使用网络字节输出流 把文件写到服务器 或者也可以说是上传

            outputStream.write(bytes,0,len);

}

//结束标记 文件上传之后给一个结束标记

        socket.shutdownOutput();

//网络字节输入流 用来读取文件 服务器有了这个文件给客户端响应我们需要读到这个文件

        //通俗讲服务器回写的数据

        InputStream inputStream = socket.getInputStream();

while ((len=inputStream.read(bytes))!=-1){

System.out.println(new String(bytes,0,len));

}

fileInputStream.close();

socket.close();

/**

        * 客户端遇到了阻塞问题 服务器和客户端都没有停下来

        * 上传文件给客户端一个结束标记 shutdown

*

*

        * 文件的优化

        */

    }

}

服务器端

package com.network;

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Random;

/**

* @ClassName: TcpServer

* @Description:

* @Author: Zhangliya

* @CreateDate: 2020/6/23 21:42

* @Version: 1.0

* @Copyright: Copyright2019-2020 BJCJ Inc.All rights reserved.

**/

public class TcpServer {

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

//首先要创建一个服务器host

        ServerSocket serverSocket =new ServerSocket(8888);

/**

        * 优化文件 让服务器一直处于接收的状态 不用关闭

        *

        * 继续优化 线程加快速度

        */

        new Thread(new Runnable() {

@Override

            public void run() {

//注意run方法中没有声明抛出异常 所以要用到try catch

                while (true) {

try {

//这个服务器要给客户端一个响应

                        Socket accept =serverSocket.accept();

//读取客户端发送来的文件

                        InputStream inputStream = accept.getInputStream();

byte[] bytes =new byte[1024];

//但是这里我们需要判断一下服务器中有没有文件 把文件存在服务器硬盘的哪里

                        //所以新建一个服务器本地的文件

                        File file =new File("C:\\ideawork");

//判断是否存在

                        if (!file.exists()) {

file.mkdirs();//生成所有目录的意思

                        }

//优化文件名 就像网上下载文件一样 都会有很长的文件名

                        String filename ="zhoumo" + System.currentTimeMillis() +new Random().nextInt(9999) +".txt";

//在本地创建一个字节输出流

                        FileOutputStream fileOutputStream =new FileOutputStream(file +"\\" + filename);

//用来写入客户端传向服务器的文件

                        int len =0;

while ((len = inputStream.read(bytes)) != -1) {

System.out.println(new String(bytes,0, len));

//把读取到的文件写到硬盘上

                            fileOutputStream.write(bytes,0, len);

}

InputStream inputStream1 = accept.getInputStream();

//读取回写数据

                        while ((len = inputStream1.read(bytes)) != -1) {

System.out.println(new String(bytes,0, len));

}

//给客户端回写一个资源

                        accept.getOutputStream().write("文件上传成功".getBytes());

//资源释放

                        fileOutputStream.close();

accept.close();

}catch (IOException e) {

System.out.println(e);

}

}

}

}).start();

// serverSocket.close();

    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。