Java网络编程 ---- TCP 网络通信编程(一)

简介: Java网络编程 ---- TCP 网络通信编程

视频:【零基础 快速学Java】韩顺平 零基础30天学会Java

1. Socket

  1. 套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准。
  2. 通信的两端都要有Socket,是两台机器间通信的端点
  3. 网络通信其实就是Socket间的通信。
  4. Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
  5. 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端

2. TCP 网络通信编程

  1. 基于客户端服务端的网络通信
  2. 底层使用的是TCP/IP协议
  3. 应用场景举例:客户端发送数据,服务端接受并显示控制台
  4. 基于Socket的TCP编程

3. 应用案例 1(使用字节流)

  1. 编写一个服务器端,和一个客户端
  2. 服务器端在9999端口监听
  3. 客户端连接到服务器端,发送"hello, server",然后退出
  4. 服务器端接收到客户端发送的信息,输出,并退出

SocketTCP01Server.java

package java学习.网络编程.TCP;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketTCP01Server {
    public static void main(String[] args) throws IOException {
//        编写一个服务器端
//        服务器端在9999端口监听
//        在本机 的 9999 端口监听, 等待连接
//        要求在本机没有其它服务在监听 9999
//        这个 ServerSocket 可以通过 accept() 返回多个 Socket[多个客户端连接服务器的并发]
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println( "服务端,在9999端口监听,等待连接..." );
//        当没有客户端连接 9999 端口时,程序会 阻塞, 等待连接
//        如果有客户端连接,则会返回 Socket 对象,程序继续
        Socket socket = serverSocket.accept();
        System.out.println( "服务端 socket=" + socket.getClass() );
//        服务器端接收到客户端发送的信息,输出,并退出
//        通过 socket.getInputStream() 读取客户端写入到数据通道的数据, 显示
        InputStream inputStream = socket.getInputStream();
//        IO 读取
        byte[] buf = new byte[1024];
        int readLen = 0;
        while ( (readLen=inputStream.read(buf))!=-1 ) {
            //根据读取到的实际长度,显示内容.
            System.out.println( new String(buf, 0, readLen) );
        }
//        关闭流和 socket
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

SocketTCP01Client.java

package java学习.网络编程.TCP;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTCP01Client {
    public static void main(String[] args) throws IOException {
//        连接服务端 (ip , 端口)
//        连接本机的 9999 端口, 如果连接成功,返回 Socket 对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println( "客户端 socket=" + socket.getClass() );
//        连接上后,生成 Socket, 通过 socket.getOutputStream()
//        得到 和 socket 对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();
//        通过输出流,写入数据到 数据通道
        outputStream.write("hello server".getBytes());
//        关闭流对象和 socket, 必须关闭
        outputStream.close();
        socket.close();
        System.out.println( "客户端退出" );
    }
}

4. 应用案例 2(使用字节流)

  1. 编写一个服务端,和一个客户端
  2. 服务器端在9999端口监听
  3. 客户端连接到服务端,发送"hello, server",并接收服务器端回发的"hello,client",再退出
  4. 服务器端接收到客户端发送的信息,输出,并发送"hello, client",再退出

SocketTCP02Server

package java学习.网络编程.TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketTCP02Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println( "服务端在9999端口监听..." );
        Socket socket = serverSocket.accept();
        System.out.println( "服务端 socket=" + socket.getClass() );
//        输入流,读取
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int readLen = 0;
        while ( (readLen=inputStream.read(buf))!=-1 ) {
            System.out.println( new String(buf, 0, readLen) );
        }
//        输出流,输出
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write( "hello client".getBytes() );
//        输出结束标志
        socket.shutdownOutput();
//        关闭流
        outputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }

SocketTCP02Client

package java学习.网络编程.TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTCP02Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println( "客户端 socket=" + socket.getClass() );
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello server".getBytes());
//        输出结束标志
        socket.shutdownOutput();
        InputStream inputStream = socket.getInputStream();
        int readLen = 0;
        byte[] buf = new byte[1024];
        while ( (readLen=inputStream.read(buf))!=-1 ) {
            System.out.println( new String(buf, 0, readLen) );
        }
        inputStream.close();
        outputStream.close();
        socket.close();
        System.out.println("客户端退出...");
    }
}

5. 应用案例 3(使用字符流)

  1. 编写一个服务端,和一个客户端
  2. 服务端在9999端口监听
  3. 客户端连接到服务端,发送"hello, server",并接收服务端回发的"hello,client",,再退出
  4. 服务端接收到客户端发送的信息,输出,并发送"hello, client"。再退出

SocketTCP03Server

package java学习.网络编程.TCP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketTCP03Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println( "服务端在9999端口监听" );
        Socket accept = serverSocket.accept();
        InputStream inputStream = accept.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);
//        输出
        OutputStream outputStream = accept.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello client 字符流");
//        插入一个换行符,表示回复内容的结束
        bufferedWriter.newLine();
        bufferedWriter.flush();
//        关闭
        bufferedWriter.close();
        bufferedReader.close();
        accept.close();
        serverSocket.close();
    }

SocketTCP03Client

package java学习.网络编程.TCP;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketTCP03Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello server 字符流");
//        插入一个换行符,表示写入的内容结束, 注意,要求对方使用 readLine()!!!!
        bufferedWriter.newLine();
        bufferedWriter.flush();
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String line = bufferedReader.readLine();
        System.out.println(line);
//        关闭
        bufferedReader.close();
        bufferedWriter.close();
        socket.close();
        System.out.println("客户端退出...");
    }
}


相关文章
|
6月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
280 6
|
6月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
386 1
|
6月前
|
安全 前端开发 Java
从反射到方法句柄:深入探索Java动态编程的终极解决方案
从反射到方法句柄,Java 动态编程不断演进。方法句柄以强类型、低开销、易优化的特性,解决反射性能差、类型弱、安全性低等问题,结合 `invokedynamic` 成为支撑 Lambda 与动态语言的终极方案。
284 0
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
345 1
|
6月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
342 1
|
6月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
606 0
|
SQL 监控 安全
网络安全与信息安全:漏洞、加密与安全意识
随着互联网的迅猛发展,网络安全和信息安全问题日益受到关注。本文深入探讨了网络安全漏洞、加密技术以及提高个人和组织的安全意识的重要性。通过分析常见的网络攻击手段如缓冲区溢出、SQL注入等,揭示了计算机系统中存在的缺陷及其潜在威胁。同时,详细介绍了对称加密和非对称加密算法的原理及应用场景,强调了数字签名和数字证书在验证信息完整性中的关键作用。此外,还讨论了培养良好上网习惯、定期备份数据等提升安全意识的方法,旨在帮助读者更好地理解和应对复杂的网络安全挑战。
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
415 17
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
327 10
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。