TCP通信

第二十一章 网络通信

本章节主要讲解的是TCP和UDP两种通信方式它们都有着自己的优点和缺点 这两种通讯方式不通的地方就是TCP是一对一通信 UDP是一对多的通信方式 接下来会一一讲解

TCP通信

TCP通信方式呢 主要的通讯方式是一对一的通讯方式,也有着优点和缺点 它的优点对比于UDP来说就是可靠一点 因为它的通讯方式是需要先发送消息 看看客户端是否能够接收到消息 如果没有回复消息的话 服务端 就不会发出文件 等待客户端回复消息,这个握手模式的话 就会非常可靠 以下代码进行讲解:

客户端代码:

package tcp;

import java.io.*;

import java.net.Socket;

import java.util.Scanner;

/**

* Socket客户端

**/

public class SocketClient {

public static void main(String[] args) {

Socket s = null;

try {

// 与ip为127.0.0.1、端口为12345的服务端建立连接

s = new Socket("127.0.0.1", 12345);

// 创建输入流接收服务端发送的消息(字节流)

InputStream is = s.getInputStream();

// 将服务端返回的字节流转化为字符流

InputStreamReader isr = new InputStreamReader(is);

// 创建字符流读取缓冲区,方便每行读取

BufferedReader br = new BufferedReader(isr);

// 创建输出流返回消息

OutputStream os = s.getOutputStream();

// 创建输出流缓冲

PrintWriter pw = new PrintWriter(os);

// 创建发送消息的线程

Runnable rOut = () -> {

boolean flag = true;

while (flag) {

try {

// 接收控制台输入

Scanner scan = new Scanner(System.in);

String msg = scan.nextLine();

// 将输入写入缓冲

pw.println(msg);

// 将缓冲内的数据推送至服务端并清空缓冲区

pw.flush();

} catch (Exception e) {

flag = false;

e.printStackTrace();

}

}

};

// 创建接收消息的线程

Runnable rIn = () -> {

boolean flag = true;

while (flag) {

try {

// 逐行读取服务端返回的消息并打印

String str = br.readLine();

System.out.println("服务端的消息:" + str);

} catch (IOException e) {

flag = false;

e.printStackTrace();

}

}

};

// 启动两个线程

Thread tOut = new Thread(rOut);

Thread tIn = new Thread(rIn);

tOut.start();

tIn.start();

}catch (IOException e) {

try {

// 释放资源

s.close();

} catch (Exception exception) {

exception.printStackTrace();

}

e.printStackTrace();

}

}

}

服务端代码:

package tcp;

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Scanner;

/**

* Socket服务端

**/

public class SocketServer {

public static void main(String[] args) {

ServerSocket ss = null;

Socket s = null;

try {

// 创建监听端口为12345的Socket服务端

ss = new ServerSocket(12345);

System.out.println("服务端Socket服务已建立,等待客户端连接...");

// 通过ss.accept()开始持续监听12345端口,当有连接时获取收到的包装成Socket的客户端对象

s = ss.accept();

// 获取客户端的IP地址和端口号

String ip = s.getInetAddress().getHostAddress();

int port = s.getPort();

System.out.println("服务端与 " + ip + ":" + port + " 已建立连接");

// 创建输入流接收客户端发送的消息(字节流)

InputStream is = s.getInputStream();

// 将客户端发送的字节流转化为字符流

InputStreamReader isr = new InputStreamReader(is);

// 创建字符流读取缓冲区,方便每行读取

BufferedReader br = new BufferedReader(isr);

// 创建输出流返回消息

OutputStream os = s.getOutputStream();

// 创建输出流缓冲

PrintWriter pw = new PrintWriter(os);

// 创建接受信息的线程

Runnable rIn = () -> {

boolean flag = true;

while (flag) {

try {

// 逐行读取客户端发送的消息并打印

String str = br.readLine();

System.out.println("客户端的消息:" + str);

} catch (IOException e) {

flag = false;

e.printStackTrace();

}

}

};

// 创建发送消息的线程

Runnable rOut = () -> {

boolean flag = true;

while (flag) {

try {

// 接收控制台输入

Scanner scan = new Scanner(System.in);

String msg = scan.nextLine();

// 将输入写入缓冲

pw.println(msg);

// 将缓冲内的数据推送至客户端并清空缓冲区

pw.flush();

} catch (Exception e) {

flag = false;

e.printStackTrace();

}

}

};

// 开启两个线程

Thread tIn = new Thread(rIn);

Thread tOut = new Thread(rOut);

tIn.start();

tOut.start();

} catch (IOException e) {

try {

// 释放资源

ss.close();

s.close();

} catch (Exception exception) {

exception.printStackTrace();

}

e.printStackTrace();

}

}

}

服务端代码图已经客户端的代码图:

相关推荐
ALex_zry4 小时前
C++网络编程心跳机制与连接保活:长连接稳定性保障
开发语言·网络·c++
@insist1235 小时前
网络工程师-信道容量计算与 PCM 编码:数据通信核心原理及软考考点解析
网络·网络工程师·pcm·软考·软件水平考试
桌面运维家7 小时前
VHD/VHDX 数据守护:BAT位图校验与修复
linux·服务器·网络
F1FJJ8 小时前
Shield CLI Postgres v0.3.10:当 142 张表挤在一张 ER 图里,我们做了什么
网络·vscode·网络协议·postgresql·开源软件
TechWayfarer8 小时前
高并发场景下的IP归属地查询架构:从20ms到0.5ms的优化实践
网络协议·tcp/ip·架构
Hello_Embed8 小时前
嵌入式上位机开发入门(四):TCP 编程 —— Client 端实现
网络·笔记·网络协议·tcp/ip·嵌入式
小雨青年8 小时前
鸿蒙 HarmonyOS 6 | Video 组件网络视频播放异常排查实战
网络·音视频·harmonyos
网硕互联的小客服9 小时前
CentOS系统如何卸载桌面并以shell 字符界面启动?
运维·服务器·网络·安全
电子科技圈11 小时前
Durin:Aliro标准赋能,打造无缝移动入户体验
人工智能·mcu·物联网·网络协议·智能家居·智能硬件·iot
攻城狮在此11 小时前
华三中小型企业二层组网配置案例一(单ISP+单链路)
网络·华为