Zookeeper教程-8 Socket机制

Socket概述

Socket,又称为套接字,用于描述IP地址和端口。应用程序通常通过socket向网络发出请求或者应答网络请求。Socket就是为网络编程提供的一种机制:

  • 通信两端都有socket
  • 网络通信其实就是socket之间的通信
  • 数据在两个socket之间通过IO传输
  • 网络编程也称作为Socket编程,套接字编程
  • Socket通信是Client/Server模型
基于UDP协议的Socket通信

新建Java工程:socket2020
核心类:DatagramSocket
客户端:创建类com.antherd.socket.udp.UDPSocketClient

package com.antherd.socket.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPSocketClient {

  public static void main(String[] args) throws Exception {
    // 创建发送端的Socket对象
    DatagramSocket client = new DatagramSocket();
    // 把发送的数据打包
    String message = "Hello UDP?";
    InetAddress address = InetAddress.getLocalHost();
    int port = 12312;
    DatagramPacket packet = new DatagramPacket(message.getBytes(), message.getBytes().length, address, port);
    // 发送打包的数据
    client.send(packet);
    // 资源释放
    client.close();
  }
}

服务端:创建类com.antherd.socket.udp.UDPSocketServer

package com.antherd.socket.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPSocketServer {

  public static void main(String[] args) throws Exception {
    // 创建服务端socket对象,DatagramSocket
    DatagramSocket server = new DatagramSocket(12312);
    // 创建接收数据的数据包(数据接收的容器)
    byte[] bytes = new byte[1024];
    DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
    // 接收数据
    server.receive(packet);
    // 针对数据包进行解析
    String host = packet.getAddress().getHostAddress();
    byte[] data = packet.getData();
    System.out.println("接收来自:" + host + ",信息:" + new String(data));
    // 释放资源
    server.close();
  }
}

先启动服务端程序,服务端程序在接收到消息前一直处于阻塞状态。接着启动客户端,客户端发送消息后退出运行。服务端接收到消息后也停止运行。

服务端接收到消息

基于TCP协议的Socket通信

核心类:Socket
客户端:创建类com.antherd.socket.tcp.TCPSocketClient

package com.antherd.socket.tcp;

import java.io.OutputStream;
import java.net.Socket;

public class TCPSocketClient {

  public static void main(String[] args) throws Exception {
    // 创建客户端的Socket服务
    // 在Socket中指定传输数据的目的ip和端口
    Socket client = new Socket("127.0.0.1", 12312);
    // 通过Socket建立的通道输出数据
    // 取得输出流,写数据
    OutputStream outputStream = client.getOutputStream();
    outputStream.write("Hello TCP?".getBytes());
    // 释放资源
    client.close();
  }
}

核心类:ServerSocket
服务端:创建类com.antherd.socket.tcp.TCPSocketServer

package com.antherd.socket.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPSocketServer {

  public static void main(String[] args) throws Exception {
    // 建立服务端的Socket服务, 并且监听本机的一个端口
    ServerSocket server = new ServerSocket(12312);
    // 监听连接,阻塞的方法,有请求过来,建立连接,返回与之对应的Socket来通信,ServerSocket依然保持服务
    Socket s = server.accept();
    // 获取输入流,读取数据
    InputStream inputStream = s.getInputStream();
    byte[] bytes = new byte[1024];
    int length = inputStream.read(bytes);
    System.out.println("信息:" + new String(bytes, 0, length));
    // 释放资源,一般不关闭ServerSocket,用于一直接受数据
    s.close();
  }
}

先启动服务端程序,服务端程序在接收到消息前一直处于阻塞状态。接着启动客户端,客户端发送消息后退出运行。服务端接收到消息后未停止运行,继续接受消息。

SocketServer接收到信息

Zookeeper视频教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值