zoukankan      html  css  js  c++  java
  • 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();
        }
    }

  • 相关阅读:
    Eclipse / android studio 添加第三方jar包 步骤
    Android checkbox 自定义点击效果
    Android 程序打包和安装过程
    Android 基础
    (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
    (转)eclipse 导入Android 项目 步骤
    微信开放平台注册 步骤
    Android Studio 初级安装
    数组
    作用域问题代码
  • 原文地址:https://www.cnblogs.com/KiligYou/p/10978827.html
Copyright © 2011-2022 走看看