【网络编程】TCP Socket编程

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

流套接字: 使用传输层TCP协议
TCP: 即Transmission Control Protocol(传输控制协议),传输层协议。
TCP的特点:

  1. 有连接
  2. 可靠传输
  3. 面向字节流
  4. 有接收缓冲区,也有发送缓冲区
  5. 大小不限

1. ServerSocket

ServerSocket 是创建TCP服务端Socket的API。

注意: ServerSocket 只能用于 服务器端。

构造方法:

方法签名 方法说明
ServerSocket(int port) 创建一个服务端流套接字Socket,并绑定到指定端口

方法:

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

2. Socket

Socket 是客户端Socket,或服务端中接收到客户端建立连接(accept方法)的请求后,返回的服务端Socket。

构造方法:

方法签名 方法说明
Socket(String host, int port) 创建一个客户端流套接字Socket,并与对应IP的主机上,对应端口的进程建立连接

注意:这里面的 host 和 port 是要连接的服务器的 IP 地址和端口号。

方法:

方法签名 方法说明
InetAddress getInetAddress() 返回套接字所连接的地址
InputStream getInputStream() 返回此套接字的输入流
OutputStream getOutputStream() 返回此套接字的输出流

3. TCP的长短连接

TCP发送数据时,需要先建立连接,什么时候关闭连接就决定是短连接还是长连接:

短连接: 每次接收到数据并返回响应后,都关闭连接,即是短连接。也就是说,短连接只能一次收数据。
长连接: 不关闭连接,一直保持连接状态,双方不停的收发数据,即是长连接。也就是说,长连接可以多次收发数据。

两者区别如下:

  1. 建立连接、关闭连接的耗时:短连接每次请求、响应都需要建立连接,关闭连接;而长连接只需要第一次建立连接,之后的请求、响应都可以直接传输。相对来说建立连接,关闭连接也是要耗时的,长连接效率更高。
  2. 主动发送请求不同:短连接一般是客户端主动向服务端发送请求;而长连接可以是客户端主动发送请求,也可以是服务端主动发。
  3. 两者的使用场景有不同:短连接适用于客户端请求频率不高的场景,如浏览网页等。长连接适用于客户端与服务端通信频繁的场景,如聊天室,实时游戏等。

4. Socket 通信模型

tcp socket,网络编程,网络,tcp/ip,服务器

5. 代码示例:TCP 回显服务器

服务器代码:

class TcpEchoServer {
    public ServerSocket serverSocket;//专门用来接受请求并建立链接
    public Socket clientSocket;//专门用来处理请求
    public TcpEchoServer(int port) throws IOException {
        this.serverSocket=new ServerSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动!");
        //也可以利用线程池
        ExecutorService threadsPool= Executors.newCachedThreadPool();
        while(true){
            //接受请求
            clientSocket=serverSocket.accept();
//            //利用多线程才能让服务器同时处理多个客户端的请求
//            Thread t=new Thread(()->{
//                //建立链接并处理请求
//                try {
//                    createConnection(clientSocket);
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            });
//            t.start();
            //创建线程池相对于每次创建一个线程来说效率更高一些
            threadsPool.submit(()->{
                try {
                    createConnection(clientSocket);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
        }
    }

    public void createConnection(Socket clientSocket) throws IOException {
        System.out.printf("[%s:%d]建立链接成功\n",clientSocket.getInetAddress().toString(),clientSocket.getPort());
        //三个步骤
        //1.读取客户端请求(根据打开的文件流确定了读取的是客户端发来的请求)
        //这里针对TCP的读写和对于文件的读写是一摸一样的
        //利用socket构造文件流
        try(InputStream inputStream=clientSocket.getInputStream()){//注意打开的流
            //直接利用scanner读取(利用原生的InputStream也是可以的,但Scanner更方便)
            Scanner scanner=new Scanner(inputStream);
            try(OutputStream outputStream=clientSocket.getOutputStream()){//注意打开的流
                while(true){
                    
                    if(!scanner.hasNext()){
                        System.out.printf("[%s:%d]断开链接\n",clientSocket.getInetAddress().toString(),clientSocket.getPort());
                        break;
                    }
                    //读取请求(TCP以字符流进行传输)
                    // 读到空白符/ 空格/换行才会停止
                    String request=scanner.next();
                    //2.根据请求计算响应
                    String response=process(request);
                    //3.返回响应(根据打开的文件流决定了是往客户端返回请求)
                    //为了方便用PrintWriter对OutputStream进行包裹
                    PrintWriter printWriter=new PrintWriter(outputStream);
                    // 因为使用 next,读到空白符/ 空格/换行才会停止,所以须使用 println 
                    printWriter.println(response);
                    printWriter.flush();
                    System.out.printf("[%d][req:%s resp:%s]\n",clientSocket.getPort(),request,response);
                }
            }
        }finally {
            clientSocket.close();//记得及时关闭
        }
    }

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

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

客户端代码:

class TcpEchoClient {
    public Socket client;
    //TCP中客户端构造函数的ip和port指的是要链接的服务器的IP和port
    public TcpEchoClient(String serverIp, int serverPort) throws IOException {
        this.client = new Socket(serverIp, serverPort);
    }

    public void start() throws IOException {
        System.out.println("和服务器建立链接成功");
        Scanner scanner = new Scanner(System.in);
        //这里针对TCP的读写和对于文件的读写是一摸一样的
        //利用socket构造文件流
        try (InputStream inputStream = client.getInputStream()) {
            try (OutputStream outputStream = client.getOutputStream()) {
                //接收从控制台输入的字符串
                while (true) {
                    System.out.println("->");
                    String request = scanner.next();
                    //构造请求并发送请求(PrintWriter和Scanner对应)//注意文件流
                    PrintWriter printWriter = new PrintWriter(outputStream);
                    // 因为使用 next,读到空白符/ 空格/换行才会停止,所以须使用 println 
                    printWriter.println(request);
                    printWriter.flush();//如果不及时刷新,服务器可能不能及时接收到数据
                    //接收响应
                    Scanner respScanner = new Scanner(inputStream);
                    String response = respScanner.next();
                    //显示到控制台上
                    System.out.printf("[req:%s  resp:%s]\n", request, response);
                }
            }
        }
    }

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

注意:当然要先启动服务器再启动客户端!

好啦! 以上就是对 TCP Socket编程的讲解,希望能帮到你 !
评论区欢迎指正 !
文章来源地址https://www.toymoban.com/news/detail-733310.html

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

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

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

相关文章

  • 网络编程3——TCP Socket实现的客户端服务器通信完整代码(详细注释帮你快速理解)

    本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下! 今天分享的内容是TCP流套接字实现的客户端与服务器的通信,一定要理解 DatagramSocket,DatagramPacket 这两个类的作用以及方法

    2024年02月12日
    浏览(44)
  • 【网络编程】TCP Socket编程

    流套接字: 使用传输层TCP协议 TCP: 即Transmission Control Protocol(传输控制协议),传输层协议。 TCP的特点: 有连接 可靠传输 面向字节流 有接收缓冲区,也有发送缓冲区 大小不限 ServerSocket 是 创建TCP服务端Socket 的API。 注意: ServerSocket 只能用于 服务器端。 构造方法: 方法签名

    2024年02月07日
    浏览(40)
  • Java【网络编程2】使用 TCP 的 Socket API 实现客户端服务器通信(保姆级教学, 附代码)

    📕各位读者好, 我是小陈, 这是我的个人主页 📗小陈还在持续努力学习编程, 努力通过博客输出所学知识 📘如果本篇对你有帮助, 烦请点赞关注支持一波, 感激不尽 📙 希望我的专栏能够帮助到你: JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统

    2024年02月05日
    浏览(44)
  • 网络编程:TCP socket

    TCP(Transmission Control Protocol,传输控制协议)提供的是面向连接,可靠的字节流服务。即客户和服务器交换数据前,必须现在双方之间建立一个TCP连接,之后才能传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 TCP不

    2024年02月05日
    浏览(37)
  • Go语言网络编程(socket编程)TCP

    TCP协议 TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。 TCP服务端 一个TCP服务端可以同时连接很

    2024年02月09日
    浏览(34)
  • 基于TCP的Socket网络编程

    前言: Socket通信是基于TCP/IP协议的通信。在工作和做项目中应用非常广,下面来介绍下Socket网络编程! Socket的介绍 首先,在Socket网络编程中我们要了解两个重要的东西,ip和端口号,一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等。这些服务完全

    2024年02月11日
    浏览(36)
  • Go语言网络编程(socket编程)TCP粘包

    服务端代码如下: 客户端代码如下: 将上面的代码保存后,分别编译。先启动服务端再启动客户端,可以看到服务端输出结果如下: 收到client发来的数据: Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you? 收到client发来的数

    2024年02月09日
    浏览(43)
  • 【网络篇】socket编程——TCP(史上最全)

    目录 一、初始TCP 1.TCP协议特点 2.TCP头:  3.确认应答机制 4.超时重传机制 5.流量控制 6.拥塞控制 (1)TCP 的拥塞控制方法 慢开始 拥塞避免 快重传 快恢复 二、建立连接——三次握手  三、断开连接——四次挥手 四、socket编程 ##客户端API函数 ##服务端API函数 (1)TCP 是 面向连

    2024年02月08日
    浏览(31)
  • 【网络通信】socket编程——TCP套接字

    TCP依旧使用代码来熟悉对应的套接字,很多接口都是在udp中使用过的 所以就不会单独把他们拿出来作为标题了,只会把第一次出现的接口作为标题 通过TCP的套接字 ,来把数据交付给对方的应用层,完成双方进程的通信 在 tcpServer.hpp 中,创建一个命名空间 yzq 用于封装 在命名

    2024年02月13日
    浏览(32)
  • Socket编程接口API并实现简单的TCP网络编程

    #include sys/types.h #include sys/socket.h socket()创建套接字,成功返回套接字的文件描述符,失败返回-1 domain: 设置套接字的协议簇, AF_UNIX AF_INET AF_INET6 type: 设置套接字的服务类型 SOCK_STREAM SOCK_DGRAM protocol: 一般设置为 0,表示使用默认协议 int socket(int domain, int type, int protocol); bind()将

    2024年02月13日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包