网络编程(1)

目录

网络编程

(两个进程之间的通信)利用服务端(ServerSocket)和客户端(Socket)实现网络之间的通信,有两种方式TCP(打电话)、UDP(类似QQ,没有登录仍然会发送过去,可以不被接受,稳定性不如TCP,但占用资源比TCP少)

TCP:是一种面向连接的、可靠的、基于字节流的传输层通信协议,位于OSI模型第四层。

UDP:是一个数据包协议,简单面向数据报的通信协议。

OSI七层模型:

(7)应用层、(6)表达层、(5)会话层、(4)传输层、(3)网络层、(2)数据链路层、(1)物理层

ServerSocket:

ServerSocket(端口号):实例化需要填写端口号。

public Socket accept():使用ServerSocket.accept()创建一个端口,如果有客户端连接,返回一个Socket对象与客户端连接

public ServerSocket(int port) throws IOException {
    this(port, 50, (InetAddress)null);
}

Socket:

Socket(IP地址,端口号):需要填写访问的IP地址和端口号。

Socket.getOutputStream():返回Socket的输出流。

Socket.getInputStream():返回Socket的输入流。

public Socket(String IP地址, int 端口号) throws UnknownHostException, IOException {
    
        this(IP地址 != null ? new InetSocketAddress(IP地址, 端口号) : new InetSocketAddress(InetAddress.getByName((String)null), 端口号), (SocketAddress)null, true);
    }

示例:实现基础的服务端与客户端的通信(TCP):

必须服务端开启,不然会报错。

服务端:

		ServerSocket serverSocket = new ServerSocket(6666);
        System.out.println("服务器已连接,等待客户端载入。。。");
        Socket socket = serverSocket.accept();
        PrintStream out = new PrintStream(socket.getOutputStream());
        out.println("客户端连接成功!!!");
        out.close();
        socket.close();
        serverSocket.close();

客户端:

		Socket socket = new Socket("localhost",6666);
        Scanner scanner = new Scanner(socket.getInputStream());
        scanner.useDelimiter("\n");
        if(scanner.hasNext()){
            System.out.println("客户端接收成功!!!");
        }
        socket.close();

echo模型

在这里插入图片描述

实例:

服务器ServerSocket:

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        boolean flag = true;
        System.out.println("服务器已开启,随时等待连接。。。");
        //客户端访问获取Socket对象
        Socket socket = serverSocket.accept();
         /*
        传输数据到客户端:socket.getOutputStream()
        使用打印流输出之后,数据写入,在客户端使用Scanner(socket.getInputStream())获取数据
         */
        PrintStream print = new PrintStream(socket.getOutputStream());
        /*
        接受客户端的传过来的数据:socket.getOutputStream()
        服务器打印数据,当数据存入打印流后
        可以通过使用socket.getInputStream()可以获取到数据
        */
        Scanner scanner = new Scanner(socket.getInputStream());
        //根据\n进行划分
       scanner.useDelimiter("\n");
        while (flag) {
            //获取value的值判断,是否存在数据
            if (scanner.hasNext()) {
                //将客户端传过来的数据传入value中
                String value = scanner.next().trim();
                System.out.println(value);
                if ("Bye".equalsIgnoreCase(value)) {
                    print.println("终止通信!!!");
                    flag = false;
                } else {
                    //打印value的值并返回到客户端
                    print.println("【通讯中】"+value);
                }
            }
        }
        socket.close();
        serverSocket.close();
    }
}

客户端Socket:

public class Connection {
    public static void main(String[] args) throws IOException {
        boolean flag = true;
        Socket socket = new Socket("127.0.0.1", 8888);
        /*
        传输数据到服务器:socket.getOutputStream()
        使用打印流输出之后,数据写入,在服务器使用Scanner(socket.getInputStream())获取
         */
        PrintStream print = new PrintStream(socket.getOutputStream());
        /*
        接受服务器的传过来的数据:socket.getOutputStream()
        客户端打印数据,将数据存入打印流(存着socket.getOutputStream())
        使用socket.getInputStream()可以获取到数据
        */
        Scanner scanner = new Scanner(socket.getInputStream());
        scanner.useDelimiter("\n");
        while (flag) {
            String value = notNull("请输入要发送的数据:").trim();
            //传输value的数据到服务器
            print.println(value);
            if (scanner.hasNext()) {
                System.err.println(scanner.next().trim());
            }
            if ("Bye".equalsIgnoreCase(value)) {
                flag = false;
            }
        }
        socket.close();
    }

    public static String notNull(String str) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        boolean flag = true;
        String value = null;
        while (flag) {
            value = str;
            if (!(value == null || "".equals(value))) {
                System.out.println(value);
                value = bufferedReader.readLine();
                flag = false;
            } else {
                System.out.println("数据不允许为空!!!");
            }
        }
        return value;
    }
}

结果:

请输入要发送的数据:
1\
【通讯中】1\
请输入要发送的数据:
2
【通讯中】2
请输入要发送的数据:
3
【通讯中】3
请输入要发送的数据:
bye
"终止通信"

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值