• 第十一周学习视频(二)


    一、建立简单的服务器

    Java中建立一个简单的服务器需要5个步骤:
    (1)创建一个ServerSocket对象。
    eg. ServerSocket server=new ServerSocket(5776,100);
    (2)通过调用ServerSocket的accept方法等待客户端连接;若连接建立,则返回一个Socket对象,并通过该对象管理每个客户端连接。
    eg. Socket connection=server.accept();
    (3)获得OutputStream和InputStream对象, 通过发送和接收字节,使服务器能与客户端通信。
    (4)处理阶段,服务器和客户端通过OutputStream和InputStream对象通信。
    (5)传输完成时,服务器对流和Socket调用close方法,关闭连接。

    二、建立简单的客户端

    Java中建立简单的客户端需要4个步骤:
    (1)需创建一个连接到服务器的Socket,可使用Socket的构造函数,将其连接到服务器上。
    eg. Socket connection=new Socket( serverAddress, port); //创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
    (2)客户端使用Socket的方法 getOutputStream/getInputStream, 分别获得输出/输入流引用。 也可套接其他输入输出流类,增强其输入输出功能。
    (3)处理阶段,服务器和客户端使用OutputStream和InputStream对象引用进行通信。
    (4)当传输完成时,客户端会对流和Socket 调用close方法,关闭连接。

    三、 服务器程序与客户端程序的区别:

    服务器程序绑定到特定的端口来使用 ServerSocket对象。ServerSocket如同创建客户端连接的工厂。

    四、TCP和UDP区别

    TCP提供一个可靠的传输模型作为两个网络端点的字节流,有纠错能力.
    UDP没有保持的连接和数据流,数据报是一 个网络上发送的独立信息,它的到达时间、以及内容不能得到保证。

    五、无连接的客户/服务器编程

    Java中DatagramSocket类使用UDP协议,在用户和服务器间发送信息包。数据包套接字主要包括以下两个类:
    (1)DatagramPacket:表示要发送/接收的信息组成的数据包。
    (2)DatagramSoket:表示客户和服务器之间 的套接字,用于发送和接收数据包 ( DatagramPacket )。


    异常:java.net.SocketException

    六、创建数据包: DatagramPacket

    用于包装接收信息的数据包:
    DatagramPacket(byte[] buffer, int length) //构造 DatagramPacket,用来接收长度为 length 的数据包 length 的数据包
    用于包装发送信息的数据包: DatagramPacket(byte[] buffer, int length, InetAddress add, int port) //构造数据报包,用来将长度为 length 的包发 送到指定主机上的指定端口号。

    七、创建数据包套接字:DatagramSocket

    使用构造函数:
    Client端: DatagramSocket()// 一般客户端不需要指定特定的端口号,因为服务器接收到客户端的端口号包含于客户端发送的 DatagramPacket中
    Server端: DatagramSocket(int port)//绑定服务端指定端口号


    发送和接收数据包的基本方法:
    DatagramSocket .send(DatagramPacket dgp)
    DatagramSocket .receive(DatagramPacket dgp)

    八、Server发送/接收报文的标准步骤

    (1)定义数据成员
    DatagramSocket socket;
    DatagramPacket packet;
    InetAddress address;(用来存放目的地址)
    int port; (用来存放目的端口号)
    (2)创建数据报文Socket对象
    try {socket=new DatagramSocket(1111);} catch(java.net.SocketException e) {}
    socket 绑定到一个本地的可用端口,等待接收客户的请求.
    (3)分配并填写数据缓冲区(一个字节类型的数组)
    byte[] buf=new byte[256]; //存放从客户端接收的请求信息.
    (4)创建一个DatagramPacket用于接收信息
    packet=new DatagramPacket(buf, 256); //用来从socket接收数据,它只有两个参数
    (5)服务器阻塞 socket.receive(packet); //在客户的请求报道来之前一直等待
    (6)从收到的包中得到地址和端口号
    InetAddress address=packet.getAddress();
    int port=packet.getPort();
    (7)将待发送的数据送入缓冲区或来自文件,或键盘输入,放入buf
    (8)建立报文包,用来发送信息
    packet=new DatagramPacket (buf,buf.length, address,port);
    (9)发送数据包 socket.send(packet);
    (10)关闭socket socket.close();

    九、客户端接收包的步骤

    (1)定义数据成员
    int port;
    InetAddress address;
    DatagramSocket socket;
    DatagramPacket packet;
    byte[] sendBuf=new byte[256];
    (2)建立socket socket=new DatagramSocket();
    (3)向服务器发出请求报文
    address=InetAddress.getByName(args[0]);
    port=parseInt(args[1]);
    packet=new DatagramPacket(sendBuf,256,address,port); socket.send(packet); //这个包本身带有客户端的信息
    (4)客户机等待应答
    packet=new DatagramPacket(sendBuf,256);
    socket.receive(packet);(如果没有到就一直等待, 因此实用程序要设置时间限度)
    (5)处理接收到的数据
    String received=new String(packet.getData(),0); System.out.println(received);

    十、关于多客户实现方案

    第一种解决方案: 一台计算机上一次启动多个服务器程序,只要端口号不同。
    第二种方案: 将服务器写成多线程的,不同的线程为不同的客户服务。
    server只负责循环等待连接。线程负责网络连接,接收客户输入的信息。

  • 相关阅读:
    linux sort根据日期时间排序方法记录
    gitlab数据迁移与升级记录
    ubuntu加压7z分卷
    docker环境运行elasticsearch以及汉化运行kibana
    nginx 403错误 检查nginx.conf user有没有问题,最好是当前用户
    系统属性file.encoding在JVM启动后,再次设置无法对系统的默认编码造成影响 & sun.jnu.encoding
    IDEA快速选择提示代码的设置
    log4j2可以打印到控制台,但无法打印到文件
    IDEA快捷键
    Eclipse自定义快捷键
  • 原文地址:https://www.cnblogs.com/caihan/p/12784958.html
Copyright © 2020-2023  润新知