Java net 模拟服务端和客户端

进程之间的通信:
在这里插入图片描述
网络通信:
在这里插入图片描述

模拟服务器和客户端的工作方式。

创建客户端

import javax.print.DocFlavor;
import java.io.*;
import java.net.Socket;

public class EchoClient {
    private String host = "localhost";
    private int port = 8000;
    private Socket socket;

    /**
     * 构造方法
     *
     * @throws IOException
     */
    public EchoClient() throws IOException {
        socket = new Socket(host, port);
    }

    /**
     * 获取输出流
     *
     * @param socket
     * @return
     * @throws IOException
     */
    private PrintWriter getWrite(Socket socket) throws IOException {
        OutputStream outputStream = socket.getOutputStream();
        return new PrintWriter(outputStream, true);
    }

    /**
     * 获取输入流
     *
     * @param socket
     * @return
     * @throws IOException
     */
    private BufferedReader getReader(Socket socket) throws IOException {
        InputStream inputStream = socket.getInputStream();
        return new BufferedReader(new InputStreamReader(inputStream));
    }

    /**
     * 主要方法,发送信息到客户端
     *
     * @throws IOException
     */
    public void talk() throws IOException {
        try {
            BufferedReader bufferedReader = getReader(socket);
            PrintWriter printWriter = getWrite(socket);

            //获取本地输入,缓存到buffer中
            BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));


            String msg = null;
            while ((msg = localReader.readLine()) != null) {
                printWriter.println(msg);
                System.out.println(bufferedReader.readLine());
                if (msg.equals("bey")) {
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //无论如何都要执行的,关闭socket
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) throws IOException {
        new EchoClient().talk();
    }
}

创建服务端

import com.sun.media.sound.SoftJitterCorrector;
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;
import sun.awt.windows.WBufferStrategy;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.Buffer;
import java.security.spec.RSAOtherPrimeInfo;

public class EchoServer {
    private int port = 8000;
    private ServerSocket serverSocket;

    /**
     * 构造方法,用来初始化服务器
     */
    public EchoServer() throws IOException {
        serverSocket = new ServerSocket(port);
        System.out.println("服务器启动成功!!!!");
    }

    /**
     * 输出信息,下文要使用
     * @param msg
     * @return
     */
    public String echo(String msg) {
        return "echo:" + msg;
    }

    /**
     * 获取输出流
     * @param socket
     * @return
     * @throws IOException
     */
    private PrintWriter getWriter(Socket socket) throws IOException {
        OutputStream outputStream = socket.getOutputStream();
        return new PrintWriter(outputStream, true);
    }

    /**
     * 获取输入流
     * @param socket
     * @return
     * @throws IOException
     */
    private BufferedReader getReader(Socket socket) throws IOException {
        InputStream inputStream = socket.getInputStream();
        return new BufferedReader(new InputStreamReader(inputStream));
    }

    /**
     * 主要方法,用来创建服务
     */
    public void service() {
        while (true) {
            Socket socket = null;
            try {
                socket = serverSocket.accept();
                System.out.println("新的连接:" + socket.getInetAddress() + ":" + socket.getPort());
                BufferedReader bufferedReader = getReader(socket);
                PrintWriter printWriter = getWriter(socket);

                //接受客户端信息并输出信息,如果信息为bey,则不输出并结束循环
                String msg = null;
                while ((msg = bufferedReader.readLine()) != null) {
                    System.out.println(msg);
                    printWriter.println(echo(msg));
                    if (msg.equals("bey")) {
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //无论如何都要执行的,关闭socket
                try {
                    if (socket != null) {
                        socket.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    public static void main(String[] args) throws IOException {
        new EchoServer().service();
    }

}

通信原理: 在两个机器之间建立一个流,通过写入和读取数据到流来实现通信。

源码中关键类:

  • ServerSocket类。ServerSocket对象的构造方法负责将当前进程注册为服务器进程,accept监听端口,等待客户端请求。
  • Socket类,流的操作,提供了两个方法,getInputStream()和getOutStream(),分别用于获取输入流和输出流。程序只需冲输入流读取数据就能实现接受数据,向输出流写数据就能发送数据。(这个流好像是单方向的,由客户端流向客户端)

-end-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值