网络编程(最简单的客户端服务器)

网络编程基础预备

  • 客户端:主动发起请求的一方,客户端给服务器发送的数据请求(Request)
  • 服务器:被动接收请求的一方,服务器给客户端发回的数据响应(Response)
  • IP地址:用来识别互联网上的一台主机的位置
  • 端口号:用来区分一台主机上的哪个应用程序

    1.一次通信过程中,涉及个概念:

  • 源IP:发件人地址
  • 源端口:发件人姓名
  • 目的IP:收件人地址
  • 目的端口:收件人姓名
  • 协议类型

    IP本质上是一个32位的整数,常用的表示方式:使用三个.把这个整数分为四个部分,每个部分一个字节(0-255)”点分十进制“。

知道了IP才知道要发给哪台主机,知道了端口号才知道了发送给这台主机上的哪个应用程序。


2.编写一个客户端~服务器程序

Socket API

Java标准库中提供了两种风格:

1.【UDP】DatagramSocket:面向数据报(发送接收数据,必须以一定的数据报为单位进行传输

2.【TCP】ServerSocket:面向字节流


如下代码使用DatagramSocket完成:

package com.it.bite.UdpechoServer;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * @program: NetWork
 * @description
 * @author: wenwen
 * @create: 2021-08-04 10:52
 **/
//最简单的客户端服务器
public class UdpechoServer {
    private DatagramSocket socket = null;
    public UdpechoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true){
            //a)读取请求并解析
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            String request = new String(requestPacket.getData(),
                    0,requestPacket.getLength() ).trim();
            //b)根据请求计算响应
            String response = process(request);
            //c)把响应写回给客户端,响应数据就是response,需要包装成一个Packet对象
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),
                    response.getBytes().length ,requestPacket.getSocketAddress());
            socket.send(responsePacket);

            //[这是一个锦上添花的操作] 打印一条请求日志
            System.out.printf("[%s:%d] req: %s;resp: %s\n",requestPacket.getAddress().toString(),
                    requestPacket.getPort(),request,response);
        }
    }

    public String process(String request) {
        //由于此处是一个echo Server,请求内容是什么,响应内容就是什么
        //如果是一个更复杂的服务器,此处就需要包含更多的业务逻辑来进行具体的计算

//        StringBuffer stringBuffer = new StringBuffer();
//        stringBuffer.append(request);
//        stringBuffer.append("i try try");
//        return stringBuffer.toString();
        return request ;
    }

    public static void main(String[] args) throws IOException {
        //对于一个服务器程序来说,核心流程也是要分成两个
        //1.进行初始化操作(实例化 Socket对象)
        //2.进入主循环,接收并处理请求(主循环就是一个“死循环”)
        //a)读取数据并解析
        //b)根据请求计算响应
        //c)把响应结果写回到客户端

        UdpechoServer server = new UdpechoServer(9090);
        server.start();


    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值