TCP通讯

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();
        }
    }
}

 

缺点也从而发现 TCP程序是一对一的通信而如果碰到了需要发通知给好几个的话 这样的话需要重复这些操作这样就会很麻烦  所以这里就需要使用到UDP通信 一对多来通信 下一个博客将会讲解UDP一对多通信 

 

相关推荐

  1. <span style='color:red;'>TCP</span><span style='color:red;'>通讯</span>

    TCP通讯

    2023-12-08 07:24:05      34 阅读
  2. <span style='color:red;'>TCP</span><span style='color:red;'>通讯</span>

    TCP通讯

    2023-12-08 07:24:05      38 阅读
  3. <span style='color:red;'>TCP</span><span style='color:red;'>通讯</span>

    TCP通讯

    2023-12-08 07:24:05      32 阅读
  4. <span style='color:red;'>TCP</span><span style='color:red;'>通讯</span>

    TCP通讯

    2023-12-08 07:24:05      36 阅读
  5. <span style='color:red;'>TCP</span><span style='color:red;'>通讯</span>

    TCP通讯

    2023-12-08 07:24:05      32 阅读
  6. modbus tcp通讯

    2023-12-08 07:24:05       33 阅读
  7. 本地TCP通讯(C++)

    2023-12-08 07:24:05       28 阅读
  8. <span style='color:red;'>TCP</span><span style='color:red;'>通信</span>

    TCP通信

    2023-12-08 07:24:05      10 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 07:24:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 07:24:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 07:24:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 07:24:05       18 阅读

热门阅读

  1. arXiv学术速递笔记12.6

    2023-12-08 07:24:05       26 阅读
  2. dorker使用一

    2023-12-08 07:24:05       41 阅读
  3. 云主机存储类型、AZ讲解

    2023-12-08 07:24:05       35 阅读
  4. 对于React的了解与认识

    2023-12-08 07:24:05       38 阅读
  5. 基于MapBox的方法封装及调用

    2023-12-08 07:24:05       33 阅读
  6. json转yolo格式

    2023-12-08 07:24:05       38 阅读
  7. Vue 防止页面闪烁 v-cloak

    2023-12-08 07:24:05       36 阅读
  8. 深度学习毕设思路--yolov5的使用方法

    2023-12-08 07:24:05       35 阅读
  9. 业务增长产品经理常用的ChatGPT通用提示词模板

    2023-12-08 07:24:05       41 阅读
  10. Glide系列-活动缓存和内存缓存

    2023-12-08 07:24:05       28 阅读
  11. 笙默考试管理系统-MyExamTest----codemirror(47)

    2023-12-08 07:24:05       27 阅读