首先理解源IP地址和目的IP地址

在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址

了解端口号

端口号(port)是传输层协议的内容

  • 端口号是一个32位的整数
  • 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理
  • IP地址+端口号能够标识网络上的某一台主机的某一个进程(比如从QQ发消息,IP能够定位到哪一台主机,而端口号能够定位到发给这台主机的哪一个程序(如QQ程序))
  • 一个端口号只能被一个进程占用

理解 “端口号” 和 “进程ID”

  • 进程ID:只要它是一个进程那么它就有它的进程ID,一个进程可以绑定多个端口号

  • 端口号: 只有网络使用网络的进程才会有端口号,一个端口号不能被多个进程绑定

区分客服端和服务器端

客服端:主动发送(信息)请求的一端,它发送的信息叫做request
服务器端:被动接收信息并回应的一端,它返回的信息叫做response

什么是Socket(套接字编程)?

它是网卡的抽象,而网卡是用来发送消息和接收消息的(Socket API实现发送和接收消息)

socket编程

TCP和UDP通讯都数据传输层协议:

  • TCP通讯:通讯之前,必须先建立连接(如打电话,必须先拨号),他是面向字节流,使用的对象SreverSocket/Socket

  • UDP通讯:通讯之前无需进行连接(如发信息,不管对方在没在线都都会发过去),他是面向数据报的,使用的对象DatagramSocket/DatagramPacket

Socket编程的五个组成部分
  • 源地址的IP
  • 源地址的端口号
  • 目标地址IP
  • 目标地址端口号
  • 协议分类
因为UDP通讯是不需要建立连接的,所以先简单实现一个UDP通讯

首先UDP通讯需要客户端和服务器端

服务器端UDPServer

服务器端实现步骤:
1.先初始化DatagramSocket,因为这样才能实现数据的连接
2.进入主循环进行相应的操作

  • 2.1 阻塞等待客户端的连接
  • 2.2 接收到客户端的请求命令
  • 2.3 进行业务计算和处理
  • 2.4 将服务器端响应并返回给客户端

第一步:初始化先初始化DatagramSocket,并且需要传入一个端口号, IP+端口号才确定哪一台主机的进程,这里不是不设置IP。而是使用它默认的IP(0.0.0.0)

    private DatagramSocket datagramSocket = null;public UDPServer(int port) throws SocketException {datagramSocket = new DatagramSocket(port);}

第二步:阻塞等待客户端的请求命令,首先要创建一个DatagramPacketde容器来接收客户端发送的命令,当没有收到客户端发送的指令的时候,使用receive方法,,会自动地进行阻塞等待,DatagramPacketde的参数需要传入byte[]和它的长度

 DatagramPacket datagramPacket = new DatagramPacket(new byte[4096],4096);datagramSocket.receive(datagramPacket);

第三步:接收客户端发送的具体指令,因为信息之间的传递是二进制,所以接收到客户端发送的消息也是二进制的,而调用new String()里面的getData()方法能够将二进制转换成字符串,也就是能看懂的文字

//接收客户端发送的命令String requestContext = new String(requestDatagramPacket.getData());

第四步:对客户端信息的加工和处理,那么这里就直接接收到什么命令就直接返回了,这里就直接写一个方法

//客户端信息的加工和处理private String process(String requestContext) {return requestContext;}

第五步:将接收到的信息返回给客户端,也就是将信息发送给客户端,那么就需要依赖DatagramPacket,而发送消息就需要目标地址的IP和端口号,所以DatagramPacket里面的参数就需要
发送信息的内容+内容长度+客户端IP+客户端的端口号
参数解释:
发送信息的内容:因为我们上面接收到的消息和加工处理过的信息已经转换成了字符串,而发送的信息需要以二进制内容发送,所以要调用getBytes()方法
内容长度:也就是你要发送内容的多少,一定要使用字节的长度,不能使用字符的长度也就是requestContext.getBytes().length而不是requestContext.length()
客户端IP:因为上面我们通过requestDatagramPacket接收到客户端的信息,那么此时我们就可以使用requestDatagramPacket.getAddress()来拿到客户端的IP
客户端端口号:和上面客户端IP一样的获取方法

//将信息返回给客户端DatagramPacket responseDatagramPacket = new DatagramPacket(requestContext.getBytes(),requestContext.getBytes().length,requestDatagramPacket.getAddress(),//客户端的IPrequestDatagramPacket.getPort());//客户端的端口号//最后调用sent()方法,将信息发送给客户端datagramSocket.send(requestDatagramPacket);

UDPServer(服务器端的全代码)

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;/*** UDP的服务器端,使用对象 DatagramSocket / DatagramPacket*/
public class UDPServer {private DatagramSocket datagramSocket = null;public UDPServer(int port) throws SocketException {datagramSocket = new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器正常启动了~");//写一个while循环,表示一直读取客户端发送的消息while (true){//阻塞等待客户端的请求DatagramPacket requestDatagramPacket = new DatagramPacket(new byte[4096],4096);datagramSocket.receive(requestDatagramPacket);//接收客户端发送的命令String requestContext = new String(requestDatagramPacket.getData());//客户端信息的加工和处理String responseContext = process(requestContext);//将信息返回给客户端DatagramPacket responseDatagramPacket = new DatagramPacket(requestContext.getBytes(),requestContext.getBytes().length,requestDatagramPacket.getAddress(),requestDatagramPacket.getPort());//最后调用sent方法,将信息发送给客户端datagramSocket.send(requestDatagramPacket);//结果打印System.out.printf("客户端IP: %s,客户端端口:%d,客户端的内容:%s,服务器响应的内容:%s\n",requestDatagramPacket.getAddress(),requestDatagramPacket.getPort(),requestContext, responseContext);}}//客户端信息的加工和处理private String process(String requestContext) {return requestContext;}public static void main(String[] args) throws IOException {UDPServer udpServer = new UDPServer(9090);udpServer.start();}
}

执行结果

客户端UDPClient

客户端实现步骤:

  1. 初始化DatagramSocket
  2. 进入主循环执行相应流程
  • 2.1 先构建命令
  • 2.2 给服务器端发送命令
  • 2.3 阻塞等待服务器端相应
  • 2.4 打印服务器端返回的信息

第一步初始化DatagramSocket,但是这里和服务器端不一样,服务器端一直在等待命令。而客户端是给服务器端发送命令,所以需要传参目标地址的IP和端口号

//初始化DatagramSocket,客户端构建private DatagramSocket datagramSocket = null;public UDPClient() throws SocketException {datagramSocket = new DatagramSocket();}

第二步:构建客户端的请求命令

//构建客户端的请求命令System.out.println("->");String requestContext = scanner.nextLine();

第三步:给服务器端发送命令,同时也需要依赖DatagramPacket,并且要传入参数,内容+长度+目标IP(也就是服务器端的IP)+目标端口号(服务器端的端口号),最后一定要调用send方法

//给服务器端发送命令DatagramPacket resquestDatagramPacket = new DatagramPacket(requestContext.getBytes(),requestContext.getBytes().length,InetAddress.getByName(serverIp),serverPort);datagramSocket.send(resquestDatagramPacket);

第四步:阻塞等待服务器端相应,同样和服务器端接收客户端时的信息一样,也要依赖DatagramPacke

            //接收服务器端的命令DatagramPacket responseDatagramPacket = new DatagramPacket(new byte[4096],4096);//阻塞等待服务器响应的结果datagramSocket.receive(responseDatagramPacket);

第五步:打印服务器端返回的信息

//拿到服务器端响应的结果String responseContext = new String(responseDatagramPacket.getData());//打印服务器端响应的信息System.out.println("服务器端响应的信息:"+responseContext);

UDPClient(客户端的全代码)

import java.io.IOException;
import java.net.*;
import java.util.Scanner;/***客户端  使用对象 DatagramSocket / DatagramPacket*/
public class UDPClient {//初始化DatagramSocket,客户端构建private DatagramSocket datagramSocket = null;public UDPClient() throws SocketException {datagramSocket = new DatagramSocket();}public void start(String serverIp,int serverPort) throws IOException {Scanner scanner = new Scanner(System.in);while (true){//构建客户端的请求命令System.out.println("请输入你要发送的指令"+"\n"+"->");String requestContext = scanner.nextLine();//给服务器端发送命令DatagramPacket resquestDatagramPacket = new DatagramPacket(requestContext.getBytes(),requestContext.getBytes().length,InetAddress.getByName(serverIp),serverPort);datagramSocket.send(resquestDatagramPacket);//接收服务器端的命令DatagramPacket responseDatagramPacket = new DatagramPacket(new byte[4096],4096);//阻塞等待服务器响应的结果datagramSocket.receive(responseDatagramPacket);//拿到服务器端响应的结果String responseContext = new String(responseDatagramPacket.getData());//打印服务器端响应的信息System.out.println("服务器端响应的信息:"+responseContext);}}public static void main(String[] args) throws IOException {//服务器端的IP,127.0.0.1表示本机服务器地址final String serverIP = "127.0.0.1";//服务器端的端口号,服务器端的端口号我们设置的时9090,这里就传9090final  int serverPort = 9090;UDPClient udpClient = new UDPClient();udpClient.start(serverIP,serverPort);}
}

执行结果

客户端给服务器端发送命令

Socket常见API
DatagramSocket类:

网络编程套接字Socket相关推荐

  1. 网络编程套接字(四)

    网络编程套接字(四) 文章目录 网络编程套接字(四) 一.实现tcp服务器多用户版本(多进程.多线程.线程池版本) 一.实现tcp服务器多用户版本(多进程.多线程.线程池版本) tcp_process ...

  2. 网络编程套接字(三)

    网络编程套接字(三) 文章目录 网络编程套接字(三) 一.实现简单的Tcp服务器(单用户) 一.实现简单的Tcp服务器(单用户) tcp_socket.hpp #pragma once #includ ...

  3. 网络编程套接字(二)

    网络编程套接字(二) 文章目录 网络编程套接字(二) 一.简单的UDP网络程序 一.简单的UDP网络程序 封装udp_socket #pragma once #include <cstdio&g ...

  4. 网络编程套接字(一)

    网络编程套接字(一) 文章目录 网络编程套接字(一) 一.基础知识 二.sock编程接口 一.基础知识 1. 理解源IP地址和目的IP地址 在IP数据包头部中,有两个IP地址,分别叫源IP地址和目的I ...

  5. 详细讲解 —— 网络编程套接字(Java EE初阶)

    网络编程套接字 1 认识网络编程套接字 2 UDP 数据报套接字编程 2.1 UPD服务端 2.1 UDP客户端 2.3 结果测试 3 TCP流套接字编程 3.1 TCP服务端 3.2 TCP客户端 ...

  6. 【javaEE】网络编程套接字

    To u&me: 努力经营当下,直至未来明朗 文章目录 前言 一.网络编程(没时间可以跳过) 一)网络编程了解 二)相关基本概念 二.Socket套接字 三.数据报套接字通信(UDP) 写一个 ...

  7. Java网络编程套接字

    文章目录 1.网络编程基础 2.什么是网络编程 3.网络编程中的基本概念 3.1.发送端和接收端 3.2 请求和响应 3.3 客户端和服务端 3.4 常见的客户端服务端模型 4.Socket套接字 4 ...

  8. UNIX网络编程---套接字编程简介(三)

    UNIX网络编程---套接字编程简介 一.概述 从这里开始正式开始网络编程之旅,所有的函数都是基本的库函数.这些都是网络编程的基础.Come on!!!! 二.套接字地址结构 大多数套接字函数都需要一 ...

  9. 【网络编程套接字(一)】

    网络编程套接字(一) 理解源IP地址和目的IP地址 理解源MAC地址和目的MAC地址 理解源端口号和目的端口号 PORT VS PID 认识TCP协议和UDP协议 网络字节序 socket编程接口 s ...

最新文章

  1. 视觉实战|使用人工神经网络进行图像分类
  2. 在线抓图WebSnap Beta 1.2 更新
  3. map集合根据value找key,默认取第一个key
  4. AsyncTask工作机制简介
  5. 高版本转低版本_Tekla高版本模型转低版本模型插件
  6. 合并两个有序数组python_Python3合并两个有序数组代码实例
  7. bct对oracle影响,Oracle 优化篇+Rman增量备份优化之BCT(块变更追踪)
  8. 单元测试之关于JaCoCo和PowerMock冲突导致类覆盖率为0的问题
  9. 英媒:中国媒体警告将挤走苹果 苹果股价应声下跌
  10. dedecms--需要注意的细节
  11. 【今日CV 视觉论文速览】28 Nov 2018
  12. gsp 页面 html.dat,grails2.3.x在gsp显示html
  13. 公式编辑器下载、使用
  14. 计算机板卡设计仿真,电子技能训练(1-1)201492.ppt
  15. 商誉风险只是局部爆发 市场整体业绩没那么糟
  16. MySQL-存储IP地址一文解决(随便问~)
  17. “D语言风采不再”的说法言过其实
  18. 计算机专业专业导论论文题目,计算机专业导论论文.doc
  19. c语言程序与化学有关的程序,化工热力学C语言程序.doc
  20. 2020深圳计算机职称考试,2019年深圳市职称考评专业知识考试报名时间

热门文章

  1. numpy.argmax/argmin/max/min
  2. Centos7配置IP地址和DNS
  3. Docker学习总结(64)——快速理解 Docker 底层原理
  4. Docker学习总结(52)—— Docker容器环境变量相关知识点的总结
  5. 后台模拟页面登陆_模拟炒股软件支付宝同花顺都可以快速体验炒股
  6. C语言终极宝典微盘,C语言终极面试宝典.pdf
  7. 初学习C语言的小Tip
  8. “为什么中国没有Apache基金会这样的组织?”
  9. Java Concurrent--java.util.Concurrent包
  10. SQLServer 可更新订阅数据冲突的一个原因