Java 模拟基于TCP的Socket通信

简介: 效果图:单线程服务器多线程服务器客户端模拟多线程服务器代码import java.io.*;import java.

效果图:


img_58889e922b17d935e9ebc55794e3cc9e.png
单线程服务器
img_bbe93226258daca986477147df573c50.png
多线程服务器

img_749810a6d96284e202c8d72b5ac36f41.png
客户端模拟

多线程服务器代码

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class MutiThreadServer implements Runnable {

    Socket socket;

    public MutiThreadServer(Socket socket) {
        this.socket = socket;
    }

    public static void main(String[] args) throws IOException {
        int count=0;
        ServerSocket serverSocket = new ServerSocket(1234);
        System.out.println("listening");
        while (true){
            Socket socket1 = serverSocket.accept();
            System.out.println("connected");
            new Thread(new MutiThreadServer(socket1)).start();
            count++;
            System.out.println("客户端的数量:"+count);
            InetAddress address = socket1.getInetAddress();
            System.out.println("当前客户端的IP为:"+ address.getHostAddress());
        }
    }

    @Override
    public void run() {
        InputStream inputStream=null; //字节输入流
        InputStreamReader inputStreamReader=null;  //把字节输入流转化为字符输入流
        BufferedReader bufferedReader=null;  //为输入流添加缓冲
        OutputStream outputStream=null;
        PrintWriter printWriter=null;
        try {
            /**
             * 获取客户端的输入信息
             */
            inputStream = socket.getInputStream();
            inputStreamReader = new InputStreamReader(inputStream);
            bufferedReader = new BufferedReader(inputStreamReader);
            String info = null;
            while ((info = bufferedReader.readLine()) != null){
                System.out.println("我是服务器,收到客户端信息:"+info);
            }
            socket.shutdownInput(); //关闭输入流

            /**
             * 响应客户端
             */
            //获取输出流,用于向服务器发送请求
            outputStream = socket.getOutputStream();
            //把输出流转化为打印流
            printWriter = new PrintWriter(outputStream);
            printWriter.write("用户名是:Harry 欢迎您!!!");
            printWriter.flush();



        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭资源
            try {
                if (inputStream != null)
                    inputStream.close();

                if (inputStream != null)
                    inputStreamReader.close();

                if (bufferedReader != null) {
                    bufferedReader.close();
                }

                if (outputStream != null) {
                    outputStream.close();
                }

                if (printWriter != null) {
                    printWriter.close();
                }

                if (socket != null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

}

单线程服务器

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        /**
         * 创建一个服务器端的Socket,并指定要监听的端口
         */
        ServerSocket serverSocket = new ServerSocket(1234);
        System.out.println("````````````服务器即将启动````````````");
        /**
         * 启动监听
         */
        Socket socket = serverSocket.accept();

        /**
         * 获取客户端的输入信息
         */
        InputStream inputStream = socket.getInputStream(); //字节输入流
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);  //把字节输入流转化为字符输入流
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  //为输入流添加缓冲
        String info = null;
        while ((info = bufferedReader.readLine()) != null){
            System.out.println("我是服务器,收到客户端信息:"+info);
        }
        socket.shutdownInput(); //关闭输入流

        /**
         * 响应客户端
         */
        OutputStream outputStream = socket.getOutputStream(); //获取输出流,用于向服务器发送请求
        PrintWriter printWriter = new PrintWriter(outputStream); //把输出流转化为打印流
        printWriter.write("用户名是:Harry 欢迎您!!!");
        printWriter.flush();

        //关闭资源
        printWriter.close();
        outputStream.close();
        bufferedReader.close();
        inputStreamReader.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

客户端

import java.io.*;
import java.net.Socket;

public class ClientSocket {
    public static void main(String[] args) throws IOException {
        /**
         * 创建一个客户端的Socket,并指定服务器地址和端口号
         */
        Socket socket = new Socket("localhost",1234);

        OutputStream outputStream = socket.getOutputStream(); //获取输出流,用于向服务器发送请求
        PrintWriter printWriter = new PrintWriter(outputStream); //把输出流转化为打印流
        printWriter.write("用户名是:Harry,密码是:123");
        printWriter.flush();

        socket.shutdownOutput(); //关闭输出流

        /**
         * 获取服务器的信息
         */
        InputStream inputStream = socket.getInputStream(); //字节输入流
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);  //把字节输入流转化为字符输入流
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  //为输入流添加缓冲
        String info = null;
        while ((info = bufferedReader.readLine()) != null){
            System.out.println("我是客户端,收到服务器信息:"+info);
        }
        socket.shutdownInput(); //关闭输入流

        /**
         * 关闭资源
         */
        inputStream.close();
        inputStreamReader.close();
        bufferedReader.close();
        printWriter.close();
        outputStream.close();
        socket.close();
    }
}

注:测试的时候只需要启动其中一个服务器就即可。

目录
相关文章
|
6天前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
16 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
9天前
|
网络协议 安全 Java
Java Socket原理
Java Socket原理是指在Java中通过Socket实现的网络通信的基础理论与机制。Socket是网络中不同设备间通信的一种标准方式,它允许应用程序之间通过TCP/IP等协议进行数据交换。在Java中,利用Socket编程可以方便地创建客户端与服务器端应用,实现跨网络的数据传输功能,是互联网软件开发中的重要技术之一。它支持多种通信模式,如可靠的流式套接字(TCP)和数据报式套接字(UDP)。
|
8天前
|
Java
用java实现Client和Server之间的互相通信
本文介绍了如何使用Java实现客户端和服务器之间的通信,包括服务器端创建ServerSocket、接受客户端连接、读取和发送消息,以及客户端创建Socket连接、发送和接收消息的完整过程。
11 0
用java实现Client和Server之间的互相通信
|
13天前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
42 1
|
22天前
|
传感器 网络协议 Java
三大硬核方式揭秘:Java如何与底层硬件和工业设备轻松通信!
大家好,我是V哥。最近与一位从事工业互联网项目的学员交流,启发我分享Java如何与底层硬件和工业设备通信。本文将介绍三种方法:1)使用`jLibModbus`库通过Modbus协议读取设备寄存器数据;2)使用JNI(Java Native Interface)直接访问硬件;3)使用`JSerialComm`库通过串口通信读取数据。每种方法都有详细步骤和示例代码,帮助你轻松实现与硬件设备的通信。无论是工业自动化还是物联网应用,这些方法都能派上用场。欢迎关注和支持!
|
2月前
|
消息中间件 Java API
解密微服务架构:如何在Java中实现高效的服务通信
微服务架构作为一种现代软件开发模式,通过将应用拆分成多个独立的服务,提升了系统的灵活性和扩展性。然而,实现微服务之间的高效通信仍然是许多开发者面临的挑战。本文将探讨在Java环境中实现微服务架构时,如何使用不同的通信机制来优化服务之间的交互,包括同步和异步通信的方法,以及相关的最佳实践。
|
2月前
|
网络协议 Java
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
这篇文章全面讲解了基于Socket的TCP网络编程,包括Socket基本概念、TCP编程步骤、客户端和服务端的通信过程,并通过具体代码示例展示了客户端与服务端之间的数据通信。同时,还提供了多个案例分析,如客户端发送信息给服务端、客户端发送文件给服务端以及服务端保存文件并返回确认信息给客户端的场景。
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
|
1月前
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【9月更文挑战第6天】
|
2月前
|
存储 安全 Java
【多线程面试题 七】、 说一说Java多线程之间的通信方式
Java多线程之间的通信方式主要有:使用Object类的wait()、notify()、notifyAll()方法进行线程间协调;使用Lock接口的Condition的await()、signal()、signalAll()方法实现更灵活的线程间协作;以及使用BlockingQueue作为线程安全的队列来实现生产者和消费者模型的线程通信。
|
2月前
|
网络协议
socket编程(2) -- TCP通信
socket编程(2) -- TCP通信
35 0