网络编程(二)TCP回显服务器与客户端通信详解

Java利用TCP协议实现客户端与服务器通信【附通信源码】 对于如何进行客户端和服务器端数据的通信,就要用到数据的输入流和输出流了,**服务器端的Socket对象使用getOutputStream()方法获取到的输出流,将指向客户端的Socket对象使用getInputStream()方法获取到的输入流。由此就实现在服务器向客户端发送数据的一个过程,**同样的道理,客户端端的Socket对象使用getOutputStream()方法获取到的输出流,将指向服务器端的Socket对象使用getInputStream()方法获取到的输入流。//获取到客户端的输入流。 阅读详情

前言

hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹
这篇博客会解析基于TCP协议来进行网络编程,进行客户端和服务器之间的交互,TCP传输的是字节流,TCP通信时,客户端和服务器之间要建立一条连接通道,TCP的代码涉及到文件资源释放、以及多客户端访问时线程的分配,相对UDP来说会稍微复杂一些
初学的铁汁对于服务器和客户端交互的代码可能会感觉比较抽象,建议多写几次代码,结合api解析和数据传输流程细品下🐵
在这里插入图片描述🎆个人主页:洋不写bug的博客
🎆所属专栏:JavaEE学习
🎆铁汁们对于JavaEE的各种常用核心语法,都可以在上面的JavaEE专栏学习,专栏正在持续更新中🏀,有问题可以写在评论区或者私信我哦~

1,TCP回显服务器/客户端

TCP编程中,有两个核心的类:

  1. ServerSocket类,创建一个这样的对象,就相当于打开了一个socket文件,这个socket对象是专门给服务器使用的,这个类不负责发送接收,主要负责建立连接
  2. Socket类,创建一个这样的对象,就相当于打开了一个socket文件,这个类负责发送接收数据,服务器和客户端都会使用



tcp是字节流,读写的时候,是以字节为基本单位的,tcp读写的代码,跟前面文件IO中字节流读写文件的代码是一致的,用inputStream/outputStream
服务器和客户端进行通信流程跟UDP是一样(如下图),只是api有区别

在这里插入图片描述

1,服务器

服务器代码逻辑如下:

  1. ServeSocket类是专门给服务器建立连接用的,构造方法中传入端口号,创建ServeSocket对象
  2. 在start中写个while(true)循环,因为服务器要多次处理来自客户端的请求,调用serveSocket的accept方法,等待客户端的连接,没有客户端连接时,accept方法会处于阻塞状态;
    如果有客户端访问服务器了,accept方法就返回Socket对象,代表服务器与该客户端之间的一条 TCP 通道,后续操作数据都是通过返回的这个socket,serveSocket就不参与了(例如一些售楼部会雇用一些大妈,专门在大街上拉人去售楼部看房,大妈把客户拉到售楼部,交给售楼部专业的置业顾问,给客户详细的讲解房子,接着大妈再去大街上拉人,serveSocket就相当于大妈,只负责把顾客拉到售楼部去,也就是建立连接;socket就类似于置业顾问,连接后的操作,比如说详细介绍房子、讲价、签合同,是置业顾问负责的)
package network.tcp;

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

public class EchoServer {

    private ServerSocket serverSocket;

    public EchoServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true){
            Socket socket = serverSocket.accept();
            processConnection(socket);
        }
    }

    private void processConnection(Socket socket){
    }


}



processConnection方法中写服务器和客户端建立连接后进行通讯的详细过程:

  1. TCP协议服务器和客户端之间的通信是通过字节流的,字节输出流是向文件中写数据的,字节输入流是从文件中读取数据的;那流程就是客户端通过输出流往socket文件中写入数据,服务器通过输入流读取数据,进行响应后,再通过输出流把数据写到socket文件中,也就是返回给客户端
  2. 结合文件IO的知识,服务器就可以用字节数组来读取客户端发送的数据,把数据转化为字符串,进行处理,处理后要把数据再转化为字节数组类型,用输出流把数据返回给客户端
  3. 用这种方法来写代码,就会涉及到很多的字节数组和字符串的相互转化,有个更简单的方法,就可以创建个Scanner对象和PrintWriter对象,分别负责输入和输出
    平常用new Scanner(System.in),就是从控制台读取用户的输入,现在写成new Scanner(inputStream),就是让Scanner从inputStream中读取数据,后面直接用scanner.next()来获取数据即可,如果客户端传输的是int类型的数据,就用scanner.nextInt()来读取数据,特别方便
    PrintWriter就是将字符串编码为字节,写入 Socket 的字节输出流 OutputStream中,写入时用的是println方法,用System.out调用println方法就是往控制台上输出,PrintWriter调用就是往OutputStream上输出
  4. PrintWriter将字符串编码成字节后, 是先放到 PrintWriter 的内存缓冲区,不会立刻交给 OutputStream,在发送完成后还需要用flush刷新下,也可以创建PrintWriter对象时,传入一个true,将PrintWriter设置为自动刷新
  5. 写个if语句,scanner.hasNext()判断下客户端是否已经关闭,如果客户端已经关闭了,就打印客户端下线信息,退出processConnection方法,进入start方法中,等待下一次客户端的连接
    可能有的铁汁会这样想:如果客户端连接上了,但是客户端还没有输入,此时scanner.hasNext()的返回值不就是false吗,那就直接显示客户端下线,退出processConnection方法吗?
    如果客户端连接上不输入,scanner.hasNext()就会阻塞,等待输入数据;有收到数据才返回 true;只有客户端正常关闭流才返回 false
package network.tcp;

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

public class EchoServer {

    private ServerSocket serverSocket;

    public EchoServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true){
            Socket socket = serverSocket.accept();
            processConnection(socket);
        }
    }

    private void processConnection(Socket socket){
        System.out.printf("[%s:%d] 客户端上线!\n",socket.getInetAddress().toString(),socket.getPort());
        try(InputStream inputStream = socket.getInputStream();
            OutputStream outputStream = socket.getOutputStream()) {
            Scanner scanner = new Scanner(inputStream);
            PrintWriter writer = new PrintWriter(outputStream,true);
            while (true){
                //1.读取请求并解析
                if (!scanner.hasNext()){
                    System.out.printf("[%s:%d] 客户端下线!",socket.getInetAddress().toString(),socket.getPort());
                    break;
                }
                String request = scanner.next();
                //2.根据请求计算响应
                String response = process(request);
                //3.把响应写回客户端
                writer.println(response);

                System.out.printf("[%s:%d]  req:%s; resp: %s\n",socket.getInetAddress().toString(),socket.getPort(),request,response);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private String process(String request){
        return request;
    }
}

2,客户端

UDP协议是无连接的,socket是不能保存服务器IP和服务器端口号的信息的,因此上篇博客在写UDP客户端时,就创建了两个成员变量,serveIP和servePort,在构造方法中给这两个成员变量赋值,构建数据包时再传入这两个成员变量

TCP协议是有连接的,socket对象是可以保存服务器的端口号和IP的,就不需要再去创建成员变量保存IP和端口号,直接在构造方法中传入端口号和IP,创建socket对象即可

Scanner和PrintWriter的用法前面服务器代码中已经解析过了,这里就不再赘述了,客户端读取用户输入,通过PrintWriter把请求发送给服务器,再用Scanner读取服务器的返回,代码如下:

package network.tcp;

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 EchoClient {

    private Socket socket;

    public EchoClient(String serverIP,int serverPort) throws IOException {
        socket = new Socket(serverIP,serverPort);
    }

    public void start(){
        System.out.println("客户端启动!");
        Scanner scanner = new Scanner(System.in);
        try (InputStream inputStream  = socket.getInputStream();
             OutputStream outputStream = socket.getOutputStream()){
            Scanner scannerNet = new Scanner(inputStream);
            PrintWriter writer = new PrintWriter(outputStream);
            while (true){
                //1.从控制台读取用户输入
                System.out.print(">");
                String request = scanner.next();
                //2.构造请求发送给服务器
                writer.println(request);

                if(!scannerNet.hasNext()){
                    System.out.println("服务器断开了连接");
                    break;
                }
                //3.读取服务器响应
                String response = scannerNet.next();
                //4.把响应显示到控制台上
                System.out.println(response);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3,测试

在服务器类中写个main方法,启动服务器,端口号传为9090

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

上篇博客用UDP协议写了个回显服务器,main方法启动时传入的端口号也是9090
同时启动这两个服务器,虽然端口号相同,但是并不会报出异常,因为TCP:9090 和 UDP:9090 是两个完全独立的端口资源,操作系统分开管理,并不会有冲突,因为是不同的协议,UDP客户端找UDP服务器,TCP客户端找TCP服务器

在这里插入图片描述

启动这两个服务器,不要终止程序,可以在命令行中查一下,就会发现TCP和UDP是可以同时占用9090端口号的

在这里插入图片描述



在客户端中写个main方法,启动下客户端,就可以正常接收和读取数据

   public static void main(String[] args) throws IOException {
        EchoClient echoClient = new EchoClient("127.0.0.1",9090);
        echoClient.start();
    }

在这里插入图片描述
在这里插入图片描述



如果把客户端程序终止,那服务器的scanner.hasNext()方法就会返回false,服务器退出processConnection方法,并且显示客户端已经下线

在这里插入图片描述


如果客户端和服务器都启动了,服务器程序终止,那客户端的scannerNet.hasNext()就会返回flase,显示服务器断开了连接

在这里插入图片描述

这里用一个客户端连接服务器来测试,各项功能似乎都没有问题,但是这个代码中是存在两个比较严重的问题,下面会进行解析😅

2,文件资源泄露问题

在服务器的start方法中,如果没有客户端连接,这个accept方法是处于阻塞状态的,每次有客户端连接,循环一次,就会构造一个socket对象,会占用一个文件描述符
服务器被客户端访问很多次,进程的文件描述符耗尽之后,accept()、new Socket()、getInputStream()方法都会抛出异常,服务器就废掉了

    public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true){
            Socket socket = serverSocket.accept();
            processConnection(socket);
        }
    }



解决办法也很简单,在processConnection方法的末尾,加个finally语句,里面关闭下socket对象,这样每次processConnection执行完都会关闭这次连接创建的socket对象

finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }



UDP服务器并不需要关闭socket资源,因为代码逻辑不同(UDP代码如下所示),UDP服务器整个过程中只创建了一个socket对象,并不是每次有客户端访问都创建一个新的socket对象

package network.udp;

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

public class EchoServer{
    private DatagramSocket socket;

    public EchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true){
            //1.读取请求并解析
            DatagramPacket reqPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(reqPacket);
            String request = new String(reqPacket.getData(),0,reqPacket.getLength());
            //2.根据请求计算响应
            String response = process(request);
            //3.把响应写回到客户端
            DatagramPacket respPacket = new DatagramPacket(response.getBytes(),response.getBytes().length,reqPacket.getSocketAddress());
            socket.send(respPacket);
            System.out.printf("[%s:%d] req:%s, resp:%s\n",reqPacket.getAddress(),reqPacket.getPort(),request,response);
        }
    }

    public String process(String request){
        return request;
    }

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



可能有的铁汁会想:TCP服务器中的scanner和writer用不用手动关闭呢?
并不需要,因为是用try‑with‑resources的方式来写代码的,pocessConnection方法执行完成后,输入流和输出流会自动关闭,Scanner、PrintWriter 对象只是包装对象,底层流已经没了,包装对象本身就失去作用,就会被Java的垃圾回收机制回收

3,多客户端访问问题

服务器基本上都是要同时服务多个客户端的,前面测试TCP服务器时,只测试了一个客户端访问服务器,下面测试下两个客户端同时访问服务器,看能不能正常的访问

可以在IDEA上设置一下,这样运行同一个客户端代码两次,就能够启动两个客户端,点击客户端右上角运行图标旁边的这个下拉框,点击Edit Confjigurations(编辑运行配置)

在这里插入图片描述



接着在跳出的这个页面中点击Modify options(修改选项)

在这里插入图片描述



把最上面的Allow multiple instance(允许多个实例)打上对号,再点击OK保存即可
实例是一个比较广义的概念,可以把创建的对象称为实例,也可以把进程称为实例,此时就表示可以给当前的客户端程序去启动多个进程(多次运行代码可以产生多个客户端)

在这里插入图片描述



设置完成后,先把服务器启动,在执行两次客户端代码,就能启动两个客户端,如下图

在这里插入图片描述

但是服务器只有一个客户端的上线记录,而且只有第一个客户端是可以正常跟服务器交互的,第二个客户端输入后没有反应

在这里插入图片描述
在这里插入图片描述

如果把第一个客户端关掉,这时候服务器就会显示第二个客户端的上线记录,第二个客户端输入后又可以正常返回了

在这里插入图片描述

通过测试,就会发现当前的服务器处理客户端是串行处理的,只有等第一个客户端程序终止,才会连接第二个客户端,这显然是不符合服务器要求的,服务器需要能同时处理多个客户端



出现这种情况就是代码的问题,在服务器的start方法中写了一个while(true)循环,在processConnection方法中又写了个while(true)循环
当一个客户端建立连接后,进入processConnection方法,只要这个客户端不终止,processConnection中的while(true)方法就不会退出
也就是在第一个whiile(true)方法中,是一直卡到processConnection(socket);并不会进入下次循环,也不会尝试用accept方法获取新的客户端的连接,因此新的客户段尝试连接服务器就没有反应

while (true){
            Socket socket = serverSocket.accept();
            processConnection(socket);
        }
 while (true){
                //1.读取请求并解析
                if (!scanner.hasNext()){
                    System.out.printf("[%s:%d] 客户端下线!",socket.getInetAddress().toString(),socket.getPort());
                    break;
                }
                String request = scanner.next();
                //2.根据请求计算响应
                String response = process(request);
                //3.把响应写回客户端
                writer.println(response);

                System.out.printf("[%s:%d]  req:%s; resp: %s\n",socket.getInetAddress().toString(),socket.getPort(),request,response);
            }



processConnection(socket)是写到while(true)方法中的,那如何做到第二个while(true)循环不会影响到第一个while(true)循环呢?
解决办法就是线程,创建一个新的线程t去执行processConnection(socket),这样main线程执行第一个while循环,t线程执行第二个while循环,t线程并不会干扰main线程

  public void start() throws IOException {
        System.out.println("服务器启动!");
        while (true){
            Socket socket = serverSocket.accept();
            Thread t = new Thread(() ->{
                processConnection(socket);
            });
            t.start();
        }
    }

这样有客户端访问服务器时,服务器就会创建个线程,专门负责处理这个客户端的响应和请求

在这里插入图片描述



代码还可以再优化下,如果访问服务器的客户端非常多的话,就会导致线程被频繁的创建和销毁,开销比较大,就可以用线程池来进行优化
就创建个没有线程数量限制的线程池,调用submit方法,每次把任务直接交给线程池即可

    public void start() throws IOException {
        System.out.println("服务器启动!");
        ExecutorService threadPool = Executors.newCachedThreadPool();
        while (true){
            Socket socket = serverSocket.accept();
            threadPool.submit(() -> {
                processConnection(socket);
            });
        }
    }



还存在一个问题,如果有非常多的客户端访问服务器,这些客户端连接服务器后,并不会即可销毁,像网页类服务器,客户端用一会就关闭了,不会连接很长时间
但游戏类服务器,客户端连接后普遍要保持连接的时间就比较长,就会在短时间内出现大量的线程,但是操作系统的线程数目是有限的,解决这个问题,就用到了IO复用技术

IO复用技术呢可以类比宿舍带饭来理解
例如博主今天要去小吃街,给室友带饭,博主想吃扬州炒饭、室友A想吃炸串、室友B想吃热干面,那博主带饭就有三种方案:

  1. 先去买扬州炒饭,在摊子上等老板炒完;拿上扬州炒饭后,再去买炸串,也是在摊子上等老板炸完;拿上炸串后,再去买热干面,等老板拌好,三种饭就齐了,这样等待的时间就是三种饭等待的时间之和
    这种就类似于一次服务器只能处理一个客户端,处理完成这个客户端后才能处理下个客户端,也就是串行处理的
  2. 我们三个人都下楼买,各等各的,这样效率虽然高,但是开销就比较大
    就类似于最后一版代码,每次都用线程专门负责处理一个客户端的响应
  3. 博主直接报完饭后不在摊子上等,立马去下个摊子报饭,接着博主站在这三个摊子的中间,让老板做好了喊一下博主即可,这样等待的时间就是做的最慢的那个的时间
    这种方法效率比较高,开销也很小,就是IO复用技术,本质上就是用一个线程等待多个socket,哪个socket有数据了,线程处理就好了,就能在线程有限的前提下,处理更多的客户端了

这个IO复用技术在C++中会重点学习,在Java面试中是很少涉及的,Java标准库中对于多路复用的API也是比较复杂的,在实际的工作中,通常会用框架来封装这些底层操作,因此这里铁汁们只是了解下即可

结语💕💕

  • TCP服务器的代码和需要考虑的东西是要比UDP更复杂的,因为TCP 中每一个客户端连接都会对应一套独立的 Socket、输入流与输出流,多个客户端同时接入时,还得借助线程池实现并发处理
  • 包括writer和scanner进行写入和读取数据时,初学的铁汁可能会感觉比较抽象,就需要多写几次代码,细品一下
  • 下篇博客开始解析网络原理部分的内容

在这里插入图片描述

TCP/UDP客户端服务器实现通信 TCP/UDP实现编程 TCP服务器与客户端的连接过程: 客户端与服务器三次握手是在accept和connect之后建立的。 三次握手的过程: A-->B 发送SYN B->A 确认发一个ACK,再发一个SYN A->B 确认发一个ACK 四次挥手过程: A---->B  发FIN B----->A  发ACK (注意:此时,A--->B 阅读详情

相关推荐

【Qt网络编程】Tcp多线程并发服务器和客户端通信

【Qt网络编程】Tcp多线程并发服务器和客户端通信

m0_63956046的博客 4492

网络编程原理:回显服务器与客户端通信交互功能

交换机是因为路由器的LAN口过少,而需要连接到路由器的节点过多,这时候交换机的WAN通过连接路由器的LAN口,然后通过交换机的LAN口来连接其他的路由器的WAN或者电脑,来实现层层连接,构成更复杂的网络结构。在计算机中,通过网络,可以让两个主机之间相互通信,在实现相互通信的过程时,需要我们开发者通过应用程序(应用层)通过系统的API与传输层进行交互。在网络中,本质是通过光/电信号来传输数据,通过低电平表示1,高电平表示0 ,高频光信号表示1 ,低频光信号表示0。

Freedom的博客 8124

国科大 雁栖湖校区 研一上 课程避坑与生存指南

本文为国科大雁栖湖校区研一新生提供全面的课程避坑与生存指南,涵盖选课策略、核心课程学习技巧、校园生活攻略及心态管理。重点解析算法设计与分析、人工智能原理等硬核课程的学习方法,并分享食堂、住宿、自习室等实用生存技巧,帮助新生高效适应研究生生活。

weixin_29304985的博客 300

【网络编程通关之路】 Tcp 基础回显服务器(Java实现)及保姆式知识原理详解 ! ! !

1. Tcp回显服务器的普通实现 2. Tcp 回显服务器的多线程实现 3. Tcp 回显服务器的线程池实现

mgzdwm的博客 5192

树莓派介绍与可安装的操作系统

树莓派是一款由英国树莓派基金会开发的信用卡大小的微型计算机。处理器(CPU)内存(RAM)图形处理器(GPU)USB 接口网络接口(以太网和 Wi-Fi)视频输出(HDMI)音频输出用户只需添加电源、存储卡、显示器和输入设备(键盘、鼠标),就可以将其当作一台功能齐全的电脑使用。主要特点:低成本:价格亲民,适合教育和个人项目。小巧便携:体积小,便于携带和部署。功能强大:支持多种编程语言和操作系统,功能不逊于传统电脑。树莓派从最初的教育工具发展成为功能强大的多用途平台。最新的树莓派 5。

像风一样自由的博客 2196

win10安装openvpn客户端

进入C:\Program Files\TAP-Windows\bin目录,然后右键用管理员权限执行addtap.bat文件,此文件执行会创建一个网卡。链接:https://pan.baidu.com/s/1KAifTiP7qp1i5ZkfdnfwkA。4.2 进入安装目录的config下新建一个文件夹,将证书文件全部挪进去(不移动.ovpn文件)3.4 将拿到的ssl认证文件放入安装目录的config目录下。然后修改ovpn文件 “./”代表当前路径,第二个链接重复。3.1 一直下一步到这里打上勾。

qq_36200932的博客 3万+

【网络编程】——基于TCP协议实现回显服务器及客户端

【网络编程】——基于TCP协议实现回显服务器及客户端

m0_74352571的博客 4398

深度学习简介(框架)

深度学习是一种基于人工神经网络的机器学习方法,它通过模拟人脑的工作原理来解决复杂的数据模式识别问题。这种方法在图像识别、语音识别、自然语言处理等领域取得了显著的进展。深度学习是机器学习的一个子领域,它基于人工神经网络的学习算法,特别是那些具有多层(深层)结构的网络。这些深度神经网络能够学习数据的高级特征和模式。深度学习作为人工智能的关键驱动技术,已经在多个领域展现出其强大的能力。随着研究的深入和技术的发展,深度学习将继续推动人工智能的边界向前发展。

2301_77539454的博客 5351

C++网络编程:TCP服务器与客户端的实现

本文介绍了C++网络编程中TCP服务器与客户端的实现方法。主要内容包括:TCP/IP协议基础、套接字编程原理、单线程和多线程服务器的代码实现。文章详细展示了服务器创建、绑定、监听和响应客户端的完整流程,并提供了多线程处理客户端连接的示例。通过学习,读者可以掌握C++网络编程的核心技术,包括套接字操作、错误处理和并发连接管理等关键技能,为开发高效稳定的网络应用奠定基础。

编程世界如山海,探索不止。 2万+

地质工程师必备:Dips软件从数据导入到主结构面分析的完整流程解析

本文详细解析了地质工程师使用Dips软件进行主结构面分析的完整流程。从数据准备与导入、结构面分组与扇形区划分,到主结构面计算与工程解读,系统阐述了如何将野外节理数据转化为控制岩体稳定性的关键信息。重点介绍了利用等值线图识别优势组、计算统计主值及其置信椭圆,并强调了地质判断与工程应用结合的重要性。

table的专栏 341

【项目实战】功能安全目标有四个ASIL等级:A、B、C、D,ASIL D是最高的等级

功能安全是一种关注产品在异常情况下如何避免造成伤害的概念功能安全在汽车电子行业中非常重要。功能安全涉及到系统、电子和软件三个部分。(1)系统部分主要涉及概念设计(2)而具体的实施则是在电子和软件部分完成。

奶爸的编程之路,也就一周冷个三天 2822

QT网络编程——TCP服务器和客户端通信

网络编程有TCP和UDP。 TCP编程需要用到两个类: 1、QTcpServer——实现服务器的端口监听,可以提供一种服务。 2、QTcpSocket——实现套接字类,有消息的封装,可以读取和写入。 注意: QTcpServer、和QTcpSocket两个类在服务器中会用到,而客户端中只用到QTcpSocket类 一、服务器端 1、QT中TCP服务器的开发思路 1、开启服务器开启端口服务:建立QTcpServer对象,并用其中的listen()方法就可以开启指定的端口。 tcpServer->list

qq_41873236的博客 1万+

剪映自动化工具来了:AI帮你自动剪辑成片

🎬分享一个剪映自动化剪辑工具!AI 自动帮你完成从写文案、配音、加字幕、选音乐、上特效到最终导出的整套流程🎈

XiaoqiangClub的博客 855

Java EE(12)——网络编程——UDP/TCP回显服务器

回显的意思是无论客户端给服务器发送什么请求,服务器会把客户端的请求原样返回Java中UDP协议的API有两个,一个是DatagramSocket,一个是DatagramPacketJava中TCP协议的API有两个,一个是SeverSocket,一个是Socket。

2401_89167985的博客 1852

一分钟了解OpenSpec (规格)

OpenSpec是由Fission AI开源的轻量级规范驱动开发(SDD, Spec-Driven Development)CLI工具。它专为AI编程助手(如Cursor、Claude Code)设计,核心是**“先约定,后编码”:在AI写代码前,先通过结构化规范文档达成共识,让开发过程可预测、可审计、可协作**。轻量无侵入:单CLI、无依赖、不改造项目、1分钟接入存量友好:增量Spec、不重构旧文档、1→n王者完全可控:每步审查、AI按图施工、零返工协作利器。

h a 6 6 6 c k 为 你解决复杂难题! 2745

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【Java 网络编程】网络通信原理、TCP、UDP 回显服务

一、网络发展历史 互联网从何而来? 这要追溯到上个世纪 50 - 60 年代,当时正逢美苏争霸冷战,核武器给战争双方提供了足够的威慑力,想要保全自己,就要保证自己的反制手段是有效的。 如何保证能够反击: 保存指挥机构 保存核弹头和发射井 指挥机构和核弹头之间的通信链路 需要保证通信链路在核弹洗地的情况下仍然能正常运作 最终方案,以力破巧!让指挥机构和核弹头之间,有无数条可以通信的链路,哪怕其中一部分被打掉了,剩余的仍然能够正常工作,从而衍生出了今天的互联网。 中国互联网的发展是非常滞后的,90年代左右

1226 6079

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

网络编程(UDP\TCP回显服务器)

网络编程,Tcp,Udp回显服务器的实现

qq_74056922的博客 1169

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

网络编程入门:UDP和TCP回显服务器,让你的网络技能瞬间满级!

指⽹络上的主机,通过不同的进程,以编程的⽅式实现⽹络通信(或称为⽹络数据传输)。当然,我们只要满⾜进程不同就⾏;所以即便是同⼀个主机,只要是不同进程,基于⽹络来传输数 据,也属于⽹络编程。(由于设备有限,这里都用一个主机来示范)如上图:服务器就是个进程,客户端也是个进程。服务器为客户端提供数据。

2301_80958683的博客 1378

QT学习笔记之TCP通信3(TCP服务器与客户端数据互传)

本文介绍了Qt中TCP通信的实现,涉及QTcpServer和QTcpSocket两个核心类。QTcpServer用于建立TCP服务器,监听端口并接受客户端连接;QTcpSocket则用于创建TCP客户端或处理服务器新连接。文中展示了服务器监听端口、接收连接、数据传输和客户端连接服务器、数据传输的过程。同时,讨论了TCP服务器与客户端的联调步骤,包括运行工程、查看本机地址、连接和数据互传。最后,总结了在TCP通信中可能遇到的问题及其解决方案,如端口号使用、服务器关闭后客户端数据传输问题,以及端口号有效性验证。

Yz12333的博客 4347

【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序(万字博文)

Socket套接字,是由系统提供的用于网络编程的技术,是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。 前面说过,要想进行网络编程,需要使用的系统API,本质上是由传输层提供的。 传输层涉及到的主要协议有两个: 流套接字:TCP(传输控制协议) 数据报套接字:UDP(用户数据报协议)

StuLearn-LJC的博客 3086

Linux 的 TCP 网络编程 -- 回显服务器,翻译服务器

本文介绍了TCP网络编程中的关键函数及其应用,包括listen()、accept()和connect(),并详细描述了如何实现TCP回显服务器和TCP翻译服务器。listen()用于将套接字设置为监听状态,accept()用于接受客户端连接,connect()用于客户端发起连接请求。文章还展示了如何通过多线程和线程池技术处理客户端请求,并提供了代码示例和测试方法。TCP回显服务器通过线程池处理客户端请求,而TCP翻译服务器则通过多线程技术实现英文到中文的翻译功能。

CSQCSQCC的博客 1197

[JavaEE] 网络编程----UDP / TCP 回显服务器

UDP / TCP 回显服务器

weixin_75071792的博客 764

C#socket网络编程-一个服务器与多个客户端通信

最近要用到网络通讯,就学习了下C#的socket编程。 socket网络编程初识 定义 socket非常类似于电话插座。以一个电话网为例:电话的通话双方相当于相互通信的2个程序,电话号码就是ip地址。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求。对方假如在场并空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于

qq_41499448的博客 5228

GEC6818网络编程——服务器端与客户端tcp的双向通信

网络编程之实现服务器和客户端的tcp双向通信,前面是双向通信的详细流程介绍,后面附上完整的代码o(* ̄▽ ̄*)ブ

everything is possible,anything is OK. 1807

TCP的服务器和客户端的通信

TCP的服务器和客户端的通信

weixin_57539783的博客 3624
上一篇: 网络编程(一)UDP编程客户端/服务器代码详细解析
下一篇: 网络原理(一)应用层协议、DNS、传输层UDP/TCP报文格式解析
洋不写bug
博客等级 码龄2年 87粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值