网络编程学习笔记(二)基于TCP的Socket编程

基于 TCP 的 Socket 编程概述

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。基于 TCP 的 Socket 编程是网络编程中常用的方式,它允许不同主机上的程序通过网络进行数据交换。在 Java 中,使用 java.net 包下的 SocketServerSocket 类可以方便地实现基于 TCP 的 Socket 编程。

示例场景

我们以一个简单的客户端 - 服务器聊天程序为例,服务器端监听特定端口,等待客户端连接,客户端连接到服务器后,双方可以互相发送消息。

服务器端代码示例

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) {
        try (
                // 创建一个 ServerSocket 对象,监听 8888 端口
                ServerSocket serverSocket = new ServerSocket(8888);
                // 等待客户端连接,返回一个 Socket 对象
                Socket socket = serverSocket.accept();
                // 获取输入流,用于接收客户端发送的消息
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                // 获取输出流,用于向客户端发送消息
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                // 获取控制台输入流,用于获取服务器端用户输入的消息
                BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in))
        ) {
            System.out.println("客户端已连接:" + socket.getInetAddress());
            String inputLine;
            while (true) {
                // 接收客户端发送的消息
                if ((inputLine = in.readLine()) != null) {
                    System.out.println("客户端:" + inputLine);
                }
                // 获取服务器端用户输入的消息
                System.out.print("服务器:");
                String serverMessage = consoleIn.readLine();
                // 向客户端发送消息
                out.println(serverMessage);
                if ("bye".equalsIgnoreCase(serverMessage)) {
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码解释

  1. 创建 ServerSocket:使用 ServerSocket 类创建一个服务器套接字,监听指定的端口(这里是 8888)。
  2. 等待客户端连接:调用 accept() 方法等待客户端连接,该方法会阻塞,直到有客户端连接成功,返回一个 Socket 对象。
  3. 获取输入输出流:通过 Socket 对象的 getInputStream()getOutputStream() 方法获取输入输出流,用于与客户端进行数据交换。
  4. 消息交互:使用 BufferedReader 读取客户端发送的消息,使用 PrintWriter 向客户端发送消息。

客户端代码示例

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TCPClient {
    public static void main(String[] args) {
        try (
                // 创建一个 Socket 对象,连接到服务器的 8888 端口
                Socket socket = new Socket("localhost", 8888);
                // 获取输入流,用于接收服务器发送的消息
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                // 获取输出流,用于向服务器发送消息
                PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                // 获取控制台输入流,用于获取客户端用户输入的消息
                BufferedReader consoleIn = new BufferedReader(new InputStreamReader(System.in))
        ) {
            String inputLine;
            while (true) {
                // 获取客户端用户输入的消息
                System.out.print("客户端:");
                String clientMessage = consoleIn.readLine();
                // 向服务器发送消息
                out.println(clientMessage);
                // 接收服务器发送的消息
                if ((inputLine = in.readLine()) != null) {
                    System.out.println("服务器:" + inputLine);
                }
                if ("bye".equalsIgnoreCase(clientMessage)) {
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码解释

  1. 创建 Socket:使用 Socket 类创建一个客户端套接字,连接到指定的服务器地址(这里是 localhost)和端口(8888)。
  2. 获取输入输出流:同样通过 Socket 对象的 getInputStream()getOutputStream() 方法获取输入输出流,用于与服务器进行数据交换。
  3. 消息交互:使用 BufferedReader 读取服务器发送的消息,使用 PrintWriter 向服务器发送消息。

运行步骤

  1. 先运行 TCPServer 类,服务器开始监听 8888 端口。
  2. 再运行 TCPClient 类,客户端连接到服务器。
  3. 客户端和服务器可以在控制台输入消息进行交互,输入 bye 可以结束聊天。

通过这个简单的示例,你可以了解基于 TCP 的 Socket 编程的基本原理和实现方式。

posted @   皇问天  阅读(223)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2017-06-19 面试题--如何防止sql注入,使用PreparedStatement的预编译,传入的内容就不会和原来的语句发生任何匹配的关系,达到防止注入的方法
点击右上角即可分享
微信分享提示