基于TCP、UDP网络编程

这篇具有很好参考价值的文章主要介绍了基于TCP、UDP网络编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

网络协议分层

  • 应用层: 应用程序拿到数据怎么用
  • 传输层: 负责关注传输过程中起点和终点
  • 网络层 :负责整个传输过程中的路线规划
  • 数据链路层 :负责相邻节点之间的数据传输
  • 物理层: 基础设施,硬件设备

套接字

程序员写网络程序,主要编写的应用层代码,真正要发这个数据,调用下层协议,应用层要调用传输层,传输层给应用层提供一组api称为Socket
系统主要提供socket的API有两种,基于UDP的api和基于TCP的API。

UDP和TCP差异

UDP TCP
无连接 有连接
不可靠传输 可靠传输
面向数据报 面向字节流
全双工 全双工

有连接:通信双方各自记录对方的信息
可靠传输:不是100%能够传输成功,而是当我传输失败我能够知道。
面向数据报:以一个UDP数据报为基本单位
面向字节流:以字节为单位进行传输,读写灵活
全双工:一条路径双向通信

UDP的API

DatagramSocket

Datagram:“数据报”
Socket:说明此对象是一个socket对象。
socket对象:相当于对应到系统的一个特殊文件(socket文件),socket文件并非是对应到硬盘的某个区域,而是对应到网卡,所以,要想进行网络通信必须要有socket文件这样的对象,借助这个对象,才能间接操控网卡。往socket对象写数据,相当于通过网卡发送消息,从这个socket对象读数据,相当于通过网卡接受消息。
基于TCP、UDP网络编程
基于TCP、UDP网络编程

DatagramPacket

DatagramPacket:这个对象就是一个UDP数据报
基于TCP、UDP网络编程

基于UDP Socket 实现一个回显程序

  1. 读取请求并解析
  2. 根据请求计算响应
  3. 把响应返回到客户端
package demo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class demo5 {
    //通过网络通信,必须要使用socket对象
    private DatagramSocket socket=null;

    public demo5(int port) throws SocketException {
        //构造的同时绑定端口号,绑定端口不一定成功,可能某个端口被占用
        //同一个主机上,一个端口同一时刻,只能被一个进程绑定。
       socket=new DatagramSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true){
            DatagramPacket packet=new DatagramPacket(new byte[4096],4096);
            socket.receive(packet);//若无数据则会阻塞等待,
            //为了防止处理这个请求,我们将把此数据包  转换成String
            String str=new String(packet.getData(),0, packet.getLength());//取packet的byte数组
            //根据请求计算响应
            String s1=process(str);
            //根据s1,构造Packet1 ,此处要指定把数据发给谁。
            DatagramPacket packet1=new DatagramPacket(s1.getBytes(),s1.getBytes().length,packet.getSocketAddress());
            socket.send(packet1);
            System.out.println(packet.getAddress().toString()+"  "+packet.getPort()+"  "+str+"  "+s1);
        }
    }
    //回显程序,输入是啥输出是啥。
    //后续有其他服务器则会修改此方法,不是回回显了,而是有具体的业务。
    private String process(String str)   {
        return str;
    }

    public static void main(String[] args) throws IOException {
        demo5 demo5=new demo5(9090);
        demo5.start();
    }
}

package demo;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class demo6 {
    //ExecutorService executors=Executors.newCachedThreadPool();
    private DatagramSocket socket=null;
    private String severIP;
    private int severPort;
    //客户端启动需要知道服务器在哪,ip地址,端口
    public demo6(String severIP,int severPort) throws SocketException {
        //对于客户端来说,不需要端口,系统会提供一个空闲端口
        this.socket =new DatagramSocket();
        this.severIP=severIP;
        this.severPort=severPort;
    }

    public static void main(String[] args) throws IOException {
        demo6 demo6=new demo6("127.0.0.1",9090);
        demo6.start();
    }
    public void start() throws IOException {
        while(true){
            //1.读取控制台字符串
            System.out.println("请输入内容");
            Scanner sc=new Scanner(System.in);
            String request =sc.next();
            //2.把字符串构造成UDP packet,并进行发送
         DatagramPacket requestPacket=  new DatagramPacket(request.getBytes(),0,request.getBytes().length, InetAddress.getByName(severIP),severPort);
                socket.send(requestPacket);
            //3.客服端尝试读取服务器返回的响应
            DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            //4.把相应数据,转换成String
            String response= new String(responsePacket.getData(),0, responsePacket.getLength());
            System.out.printf("req: %s,resp:%s\n",request,response);
        }

    }
}

TCP的API

ServerSocket 是创建TCP服务端Socket的API。文章来源地址https://www.toymoban.com/news/detail-465748.html

方法签名 方法说明
ServerSocket(int port) 创建一个服务端流套接字Socket,并绑定到指定端口
Socket accept() 开始监听指定端口(创建时绑定的端口),有客户端连接后,返回一个服务端Socket对象,并基于该Socket建立与客户端的连接,否则阻塞等待
void close() 关闭套接字

Socket的API

方法签名 方法说明
Socket(String host, int port) 创建一个客户端流套接字Socket,并与对应IP的主机上,对应端口的进程建立连接
InetAddress getInetAddress() 返回套接字所连接的地址
InputStream getInputStream() 返回此套接字的输入流
OutputStream getOutputStream() 返回此套接字的输出流

基于TCP实现回显程序

package demo;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class demo8 {
    private ServerSocket socket=null;
    ExecutorService exe= Executors.newCachedThreadPool();
    public demo8(int port) throws IOException {
        this.socket = new ServerSocket(port);
    }
    public void stack() throws IOException {
        System.out.println("启动服务器");
        while(true) {
            Socket s = socket.accept();

            exe.submit(() -> {
                try {
                    processConnection(s);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }

    }

    public static void main(String[] args) throws IOException {
        demo8 d=new demo8(9099);
        d.stack();
    }
    public void processConnection(Socket s) throws IOException {
        try(InputStream in=s.getInputStream();
            OutputStream out=s.getOutputStream()){
            Scanner sc=new Scanner(in);//从字节流转化为字符流
            PrintWriter writer=new PrintWriter(out);
            while(true){
                if(!sc.hasNext()){//读取到数据末尾了
                    System.out.printf("%s:%d 客服端下线",s.getInetAddress().toString(),s.getPort());
                    break;
                }
                //读取数据
                String str=sc.next();
                //根据请求计算响应
                str=process(str);
                //写入网卡
                writer.println(str);
                writer.flush();//刷新缓冲区
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
        	socket.close();
        }
    }

    private String process(String str) {

        return str;
    }
}

package demo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class demo9 {
    private Socket socket=null;

    public demo9(String ip,int port) throws IOException {
        this.socket = new Socket(ip,port);//连接服务器
    }

    public static void main(String[] args) throws IOException {
        demo9 d=new demo9("127.0.0.1",9099);
        d.stack();
    }
    public void stack(){
        try(InputStream in=socket.getInputStream();
            OutputStream out=socket.getOutputStream()){
            Scanner sc=new Scanner(in);//从字节流转化为字符流
            PrintWriter writer=new PrintWriter(out);
            Scanner scanner=new Scanner(System.in);
            while(true){
                //读取键盘输入
                System.out.println("请输入:");
                String request=scanner.next();//获取数据
                writer.println(request);//将数据发送到服务器
                writer.flush();
                //读取响应
                String str= sc.next();
                //打印到控制台
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
        	socket.close();
        }
    }
}

到了这里,关于基于TCP、UDP网络编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网络编程——TCP/IP协议族(IP协议、TCP协议和UDP协议……)

    1、IP协议简介 IP协议又称 网际协议 特指为实现在一个相互连接的网络系统上从源地址到目的地传输数据包(互联网数据包)所提供必要功能的协议,是网络层中的协议。 2、特点 不可靠 :它不能保证IP数据包能成功地到达它的目的地,仅提供尽力而为的传输服务 无连接 :IP 并不

    2024年02月13日
    浏览(67)
  • Java网络编程之IP,端口号,通信协议(UDP,TCP)

    ① C/S :客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美,用户体验好 缺点:用户需要下载更新 ② B/S :浏览器/服务器 只需要一个浏览器,用户通过指定网址访问对应的服务器。 优点:不需要开发客户端,只需要页面+服务

    2024年02月03日
    浏览(78)
  • 基于TCP、UDP网络编程

    应用层 : 应用程序拿到数据怎么用 传输层 : 负责关注传输过程中起点和终点 网络层 :负责整个传输过程中的路线规划 数据链路层 :负责相邻节点之间的数据传输 物理层 : 基础设施,硬件设备 程序员写网络程序,主要编写的应用层代码,真正要发这个数据,调用下层协

    2024年02月07日
    浏览(47)
  • 【探索Linux】—— 强大的命令行工具 P.27(网络编程套接字 —— UDP协议介绍 | TCP协议介绍 | UDP 和 TCP 的异同)

    在上一篇文章中,我们深入探讨了Linux网络编程的基石——套接字(Socket)的概念以及相关的编程接口。我们了解到,套接字是网络通信过程中端与端之间数据交换的关键抽象概念,它提供了一套丰富的编程接口,使得开发者能够在应用层直接进行网络通信的开发。不仅如此

    2024年03月16日
    浏览(72)
  • 【网络编程】网络编程概念,socket套接字,基于UDP和TCP的网络编程

    前言: 大家好,我是 良辰丫 ,今天我们一起来学习网络编程,网络编程的基本概念,认识套接字,UDP与TCP编程.💞💞💞 🧑个人主页:良辰针不戳 📖所属专栏:javaEE初阶 🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。 💦期待大家三连,关注

    2023年04月20日
    浏览(58)
  • [网络编程]UDP协议,基于UDP协议的回显服务器

    目录 1.UDP协议介绍 2.UDP协议在Java中的类 2.1DatagramSocket类 2.2DatagramPacket 3.回显服务器 3.1Sever端  3.2Client端   UDP协议是一种网络协议,它是无连接的,全双工,并且是面向数据报,不可靠的一种协议。 常用于在线视频播放,游戏这种实时性要求比较高的应用。或者无需可靠传输

    2024年01月22日
    浏览(51)
  • 基于UDP/TCP的网络通信编程实现

    红色是心中永不褪色的赤诚 操作系统为网络编程提供了 Socket api , Socket是基于TCP/IP协议的网络通信的基本单元, 基于Socket的网络程序开发就是 网络编程. 由于直接与应用层联系的是传输层, 所以针对应用层协议(TCP, UDP), Shocket提供了三种套接字, 分别是 流套接字(使用TCP) , 数据报

    2024年02月08日
    浏览(52)
  • Java中的网络编程------基于Socket的TCP编程和基于UDP的网络编程,netstat指令

    Socket 在Java中,Socket是一种用于网络通信的编程接口, 它允许不同计算机之间的程序进行数据交换和通信 。Socket使得网络应用程序能够通过TCP或UDP协议在不同主机之间建立连接、发送数据和接收数据。以下是Socket的基本介绍: Socket类型 :在Java中,有两种主要类型的Socket,分

    2024年02月10日
    浏览(38)
  • 【Java基础教程】(四十七)网络编程篇:网络通讯概念,TCP、UDP协议,Socket与ServerSocket类使用实践与应用场景~

    了解多线程与网络编程的操作关系; 了解网络程序开发的主要模式; 了解 TCP 程序的基本实现; 在Java中,网络编程的核心意义是实现不同电脑主机之间的数据交互。Java采用了一种简化的概念,将这个过程进一步抽象为JVM(Java虚拟机)进程之间的通信。可以在同一台电脑上

    2024年02月15日
    浏览(63)
  • 网络编程五--自定义应用层协议

    前面回声服务器/客户端介绍了如何通过对收发IO的控制实现回声服务器/客户端。 在服务器端应用层的处理(协议)可以看作是“回声操作”,即回发客户端发来的消息。而在客户端应用层的处理(协议)则只是简单显示服务器回发的内容。 而协议的通俗理解,就是为了完成

    2024年02月03日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包