• TCP通信


    网络编程的入门:
    C/S结构 Client/Server 客户端和服务器结构            QQ 微信  迅雷
    B/S结构 Browser/Server 浏览器和服务器结构            谷歌  火狐
     
    两种架构各有优势      无论哪种都离不开网络的支持   
     
    网络编程:
    就是在一定协议下  实现两台计算机的通信程序
     
    网络通信协议:
    通信协议是对计算机必须遵守的规则------目的是完成数据交换
     
     
    TCP/IP   传输控制协议/因特网互联协议  4层分层的模型
    1.物理层
       数据链路层 底层网络协议
     
    2.网络层 IP
    3.传输层 TCP  UDP
    4.应用层 HTTP
     
     
    协议分类:
    java.net包中 包含类和接口→两种常见的网络协议支持
    TCP:面向连接的通信协议
    三次握手:
    • 客户端向服务器发出请求  等待服务器确认     
    • 服务端向客户端做出响应  确认请求      
    • 客户端再次向服务器发出确认请求  确认连接  可以保证数据安全传输    下载文件、浏览网页
     
     
    UDP:用户数据报协议   面向无连接的协议
    • 传输数据不需要连接  不管对方在不在线
    • 传输速度快,但是容易丢失数据,不可靠的协议   视屏会议、QQ聊天
     
     
     
    ​网络通信的三要素:
    协议
    IP IPv4    32位的二级制    42亿    0-255之间
       IPv6   解决网络资源不够用的问题
    ipconfig:查询自己的IP
    ping IP地址 判断网络是否畅通
    本机IP:localhost
    端口号       网络通信本质是两个进程(应用程序)    端口号用两个字节表示整数 0-65535 0-1023 不能赢知名网络服务已经用了
     
    TCP  通信:
     
    严格区别客户端  Client   服务端:Server
     
    两端通信的步骤:
    客户端主动连接服务器,连接成功才能通信
    服务器端一定要先启动
     
    java中 提供了两个类  来实现TCP程序
     
    java.net.Socket----------创建对象Socket---------发送请求给服务器   服务器做出响应两者建立通信
    java.net.ServleScoket--------创建对象ServleScoket-------相当于开启一个服务   用来等待客户端连接
     
     
    Socket套接字:
     
    此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
     
    构造方法  
     
    Scoket(InetAddress address,int port) 创建对象 连接到主机指定的端口号
     
    成员方法
    • getInputStream() 套接字的输入流
    • getOutputStream() 套接字的输出流
    • close()
    • shutdownOutput() 禁用此套接字的输出流
     
     
    ServerScoket:
     
    ServerScoket构造方法
     
    ServerSocket(int port) 绑定一个指定端口号
     
     
    成员方法
    • accept()   监听并且接受连接   用于客户端实现通信   阻塞直到建立连接
     
     
    上传图片到服务器:
     
     
    文件上传服务器的原理
     
    • 客户端使用本地字节流  读取本地文件
    • 客户端使用网络字节输出流  把图片传到服务器上
    • ​服务器使用网络字节输入流  读取客户端上传的文件
    • ​服务器端使用本地字节输出流  把客户端的文件保存到服务器的硬盘上
    • ​服务器网络输出流  给客户端写传输成功
    • ​客户端使用网络的字节输入流  读取服务器回写“传输成功”
    ​           
    ​    注意:
    客户端/服务器端和本地文件读写  必须用自己的创建流
    客户端/服务器端之间的交互   用Socket中提供的网络流
     
    客户端本地------复制------服务器
    服务器------复制------服务器本地硬盘
     
    ​    必须清楚:   数据源       目的地
     
     
     
     
     
    ServerScoket:
     
    package cn.kgc.tcp;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
     
    public class TCPServer {
        public static void main(String[] args)throws IOException {
            //建立服务器ServerSocket对象,并指定端口号
            ServerSocket serverSocket = new ServerSocket(8800);
            //通过建立的服务器ServerSocket对象调用其accept()方法监听并获得客户端的Socket对象
            Socket socket = serverSocket.accept();
            //通过监听获得的客户端的Socket对象调用getInputStream()方法获取网络输入流对象
            InputStream is = socket.getInputStream();
            byte[] bytes = new byte[1024];
            //使用网络输入流对象的read()方法读取客户端发送的数据
            int read = is.read(bytes);
            System.out.println(new String(bytes,0,read));
            //通过监听获得的客户端的Socket对象调用getOutputStream()方法获取网络输出流对象
            OutputStream os = socket.getOutputStream();
            //使用网络输出流对象的write()方法回应客户端
            os.write("OK~".getBytes());
            //释放资源
            socket.close();
            serverSocket.close();
        }
    }
     
     
     
    Socket:
     
    package cn.kgc.tcp;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
     
    public class TCPClient {
        public static void main(String[] args)throws IOException {
            //建立客户端Socket对象,指定(封装)IP地址和端口号
            Socket socket = new Socket("localhost",8800);
            //通过建立的客户端Socket对象调用其getOutputStream()方法获得网络输出流对象
            OutputStream os = socket.getOutputStream();
            //使用网络输出流对象的write()方法向服务器写入数据发出请求
            os.write("你好,服务器".getBytes());
            //通过建立的客户端Socket对象调用其getInputStream()方法获得网络输入流对象
            InputStream is = socket.getInputStream();
            byte[] bytes = new byte[1024];
            //使用网络输入流对象的read()方法读取服务器回应的数据信息
            int read = is.read(bytes);
            System.out.println(new String(bytes,0,read));
            //关闭流对象
            socket.close();
        }
    }

  • 相关阅读:
    常见的线性结构
    Lambda表达式学习笔记
    Spring Security 入门 (二)
    Spring Security 入门(一)
    Eclipse 创建 Maven 项目
    初学 Spring MVC(基于 Spring in Action)
    蓝桥杯之入学考试
    Java 学习总结
    二叉搜索树和红黑树
    Detours 劫持
  • 原文地址:https://www.cnblogs.com/KiligYou/p/10978827.html
Copyright © 2020-2023  润新知