step by step.

目录

一、 目的

二、 代码

1. 简单基础例子,深入理解(键盘输入,同意端口号,传递信息)

客户端: 

 服务端:

! Run:

!若客户端和服务端的端口号不同,则无法连接,更无法传输信息。

2. UDP

 服务器:

客户端:

!监听端口和传输端口不能设置同一个端口号,功能不同,端口号不同。


一、 目的


1、了解网络协议的基本概念和区分 OSI 模型和 TCP/IP 模型的不同点。


2、熟悉输入输出流、以及常见的流处理工具。


3、掌握基于 TCP 编程和 UDP 编程的基本步骤和对相关核心类的了解。


4、掌握简单的应用服务器工作原理,为后面 Web 服务器开发打好基础。



二、 代码

1. 简单基础例子,深入理解(键盘输入,同意端口号,传递信息)

客户端: 

package basic;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * @Author: y9
 * @Date: 2021/10/22
 * @Description: 客户端程序
 **/
public class EchoClient {
    private static final BufferedReader KEYBOARD_INPUT = new BufferedReader(
            new InputStreamReader(System.in)
    );
    public static String getString(String prompt) throws Exception { //键盘信息
        System.out.print(prompt);
        String str = KEYBOARD_INPUT.readLine();
        return str;
    }
    public static void main(String[] args) throws Exception{
        Socket client = new Socket("localhost",9999);     //定义服务器的连接信息
        Scanner scan = new Scanner(client.getInputStream());
        scan.useDelimiter("\n");
        PrintStream out = new PrintStream(client.getOutputStream());
        boolean flag = true;
        while(flag){
            String input = getString("请输入要发送的内容").trim();
            out.println(input);
            if(scan.hasNext()){                             //服务端有回应
                System.out.println(scan.next());           //获取接收内容
            }
            if("byebye".equalsIgnoreCase(input)){
                flag=false;
            }
        }
        scan.close();
        out.close();
        client.close();
    }
}

 服务端:

package basic;

import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * @Author: y9
 * @Date: 2021/10/22
 * @Description: 服务器程序
 **/
public class EchoServr {
    //服务器
    public static void main(String[] args) throws Exception{
        ServerSocket server = new ServerSocket(9999);  //服务监听端口
        System.out.println("等待客户端连接……");
        Socket client = server.accept();                    //等待客户端连接,需要RUN服务端程序
        System.out.println("成功连接……");

        Scanner scan = new Scanner(client.getInputStream());//接受客户端输入流,决定于客户端(此客户端设置为键盘输入)
        scan.useDelimiter("\n");                            //设置分隔符为回车(回车表示此消息结束,获取下一消息)
        PrintStream out = new PrintStream(client.getOutputStream());
                                                            //即将从客户端获取的信息流
        boolean flag = true;
        while(flag){
            if(scan.hasNext()){                             //有数据接收
                String val = scan.next().trim();            //获取接收内容
                if("byebye".equalsIgnoreCase(val)){         //结束标记
                    out.println("Byebyebye");
                    System.out.println("结束。^ ^");
                    flag = false;
                }else{
                    out.println("【echo】"+val);             //回应信息
                    System.out.println("服务端接收到:"+val);
                }
            }
        }
        scan.close();
        out.close();
        client.close();
        server.close();
    }
}

! Run:

先启动客户端,显示:

等待客户端连接……

然后启动服务端,显示:

等待客户端连接……
成功连接……

在客户端传入信息(键盘),显示:

请输入要发送的内容123
【echo】123
请输入要发送的内容456
【echo】456
请输入要发送的内容byebye
Byebyebye

Process finished with exit code 0

服务端接收信息的同时,显示:

等待客户端连接……
成功连接……
服务端接收到:123
服务端接收到:456
结束。^ ^

Process finished with exit code 0

!若客户端和服务端的端口号不同,则无法连接,更无法传输信息。

2. UDP

 服务器:

package basic;

import javax.xml.crypto.Data;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

/**
 * @Author: y9
 * @Date: 2021/10/22
 * @Description: UDP服务端
 **/
public class UDPServer {
    public static void main(String[] args) throws Exception{
        DatagramSocket server = new DatagramSocket(9998);   //不能再用9990,否则报错
        String str = "www.scau.edu.cn";
        DatagramPacket packet = new DatagramPacket(str.getBytes(),0,str.length(),
                InetAddress.getByName("localhost"),9990);   //发送端口,如果与客户端的不同,则接收不到。
        server.send(packet);
        System.out.println("消息发送完毕……");
        server.close();
    }
}

客户端:

package basic;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * @Author: y9
 * @Date: 2021/10/22
 * @Description: UDP客户端
 **/
public class UDPClient {
    public static void main(String[] args) throws Exception{
        //接收数据信息
        DatagramSocket client = new DatagramSocket(9990); //9990端口监听
        byte data[] = new byte[1024];                          //保存接收数据
        DatagramPacket packet = new DatagramPacket(data,data.length); //创建数据报
        System.out.println("客户端等待接收发送的信息……");
        client.receive(packet);
        System.out.println("接受到的消息内容为:"+ new String(data,0,packet.getLength()));
        client.close();
    }
}

启动服务器,显示:

消息发送完毕……

启动客户端,显示:

客户端等待接收发送的信息……
接受到的消息内容为:www.scau.edu.cn

接收成功!

!监听端口和传输端口不能设置同一个端口号,功能不同,端口号不同。