快速入门Socket网络编程

学习目标1. 网络的七层模型网络层:IP协议 (IPV4 192.168.1.112)(32位二进制–> 4个8位二进制一组 --> 4个十进制) 00000000 --> 11111111传输层:TCP和UDP应用层:HTTP协议TCP和UDP的区别对比维度TCPUDP可靠性可靠不可靠速度稍慢更快通信方式点对点点对点、一对多、多对多通信内容字节码数据报应用场景传输文件聊天、视频、语音连接面向连接无
摘要由CSDN通过智能技术生成

学习目标

1. 网络的七层模型

在这里插入图片描述
网络层:IP协议 (IPV4 192.168.1.112)(32位二进制–> 4个8位二进制一组 --> 4个十进制) 00000000 --> 11111111

传输层:TCP和UDP

应用层:HTTP协议

TCP和UDP的区别

对比

维度 TCP UDP
可靠性 可靠 不可靠
速度 稍慢 更快
通信方式 点对点 点对点、一对多、多对多
通信内容 字节码 数据报
应用场景 传输文件 聊天、视频、语音
连接 面向连接 无连接

三次握手和四次挥手

TCP(传输控制协议 Transfer Control Protocol)

分为服务端和客户端,属于可靠协议,不会丢失数据

建立TCP连接需要通过三次握手机制在服务端和客户端之间建立连接
在这里插入图片描述
三次握手:

  1. 客户端发送信号量SYN=1 和序列号seq=J 给服务端,客户端进入SYN_SENT(信号发送状态),等待服务器回答
  2. 服务器收到客户端信号后,发送信号量SYN=1、ACK=1,应答值ack=J+1,新的序列号seq=K给客户端,服务器进入SYN_RCVD(收到信号)状态
  3. 客户端收到服务器的应答消息,发送ACK=1,和应答值ack=K+1给服务器,客户端和服务器都进入ESTABLISHED(连接建立)状态

客户端和服务端断开连接需要通过四次挥手
]
四次挥手:

  1. 客户端发送信号量FIN M给服务器端,进入FIN_WAIT1状态
  2. 服务端收到后,返回ack M+1给客户端,进入CLOSE_WAIT状态
  3. 服务端在发送FIN N信号给客户端
  4. 客户端收到后,返回应答信号ACK=1 ack=N+1给服务端,连接关闭

Socket编程

Socket(套接字)基于TCP/IP协议的网络编程机制

服务端

ServerSocker类,用于对本机的某个端口进行侦听

  • 创建

    ServerSocket(int port) port是端口号

  • 方法

    close() 关闭

    Socket accept() 接收客户端的Socket,会阻塞线程直到有客户端连接

客户端

Socket类,代表客户端向服务端发送连接,进行网络通知

  • 创建

    Socket(String ip,int port) 通过ip和端口连接服务端

  • 方法

    disconnect() 关闭

    OutputStream getOutputStream() 获得输出流

    InputStream getInputStream() 获得输入流

    注意:IO流关闭后,socket会自动关闭

在这里插入图片描述

案例1,实现socket

服务端:

public class Server {
   

    public static final int PORT = 9999;

    public void start() {
   
        System.out.println("服务器启动了!");
        //创建服务端Socket
        try(ServerSocket serverSocket = new ServerSocket(PORT)){
   
            //接收客户端连接
            while(true) {
   
                Socket socket = serverSocket.accept();
                System.out.println("客户端连接了!" + socket.getInetAddress());
                //获得输入流,得到客户端发送的消息
                ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
                String str = in.readUTF();
                System.out.println("接收消息:" + str);
                //获得输出流
                ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
                out.writeUTF("服务器给你问好了!!");
                out.flush();
            }
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
   
        new Server().start();
    }
}

客户端:

public class Client {
   

    /**
     * 发送消息
     */
    public void send(String ip,int port,String msg){
   
        //创建连接
        try(Socket socket = new Socket(ip,port)){
   
            //获得输出流
            ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
            out.writeUTF(msg);
            out.flush();
            //获得输入流
            ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
            String s = in.readUTF()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值