【java高级程序设计】服务器客户端程序||web||自食用

30 篇文章 1 订阅
16 篇文章 0 订阅

step by step.

目录

一、 目的

2.1、Server端需要做的事情

2.2、Client端需要做的事情

二、 代码

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

客户端: 

 服务端:

! Run:

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

2. UDP

 服务器:

客户端:

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


一、 目的

1、了解网络协议的基本概念和区分 OSI 模型和 TCP/IP 模型的不同点。
2、熟悉输入输出流、以及常见的流处理工具。
3、掌握基于 TCP 编程和 UDP 编程的基本步骤和对相关核心类的了解。
4、掌握简单的应用服务器工作原理,为后面 Web 服务器开发打好基础。

2.1、Server端需要做的事情


创建一个ServerSocket,绑定对象监听端口,因为0~1023之间的端口大部分分配给电脑设备了,因此我们随机分配一个1024~635535之间的端口。
通过ServerSocket.accept()监听Client端的请求,等待客户端与之通信
通过输入流读取客户端发送的信息请求,读取完成以后使用Socket.shutdownOutput()关闭输出流
通过输出流向客户端发送响应信息,输出流完成时需要执行flush方法和Socket.shutdownInput()关闭输入流
关闭InputStream、OutputStream、ServerSocket、Socket占用的资源。
 

2.2、Client端需要做的事情

创建Socket,指定我们要连接的远程Server的IP地址和端口号
通过输入流向Server端发送信息,并执行flush()方法,然后调用Socket.shutdownInput()
通过输出流读取Server端传输过来的信息,执行完以后调用Socket.shutdownOutput();
最后释放所有的资源,InputStream、OutputStream、Socket。
————————————————
版权声明:本文为CSDN博主「markliwei1」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/makeliwei1/article/details/81666941

二、 代码

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

接收成功!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值