计算机网络--网络编程(1)

这篇具有很好参考价值的文章主要介绍了计算机网络--网络编程(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简单认识一下传输层中的UDP和TCP:

TCP:有链接,可靠传输,面向字节流,全双工

UDP:无连接,不可靠传输,面向数据报,全双工


有链接类似于打电话,通了就是有链接。没通就一直在等待。

无连接类似于发短信,只管发,不管到。


可靠传输就是保证信息传输的可靠性。就好比打电话时,你会询问对方在吗,对方回复你,你在发送重要数据给对方。不可靠传输,就好比发短信。假设对方开启了飞行模式,你短信依然能发,但是对方收不收得到,你并不关心也不会询问。


字节流:能按需所取,比如100个字节,可以一个字节一个字节取100次,也能5个字节5个字节的读20次。

数据报:固定的字节数据构成一个数据报,一次只能读取发送一个数据报。


全双工就是双向通信。既能发送也能接收的意思。


简单介绍了TCP,UDP的一些特性,下面我们来看Java中两个重要的网络编程的类。

DatagramSocket API 使用这个类来表示一个对象,在操作系统中,把这个socket对象也是当成一个文件来处理。一个socket对象,就可以和另外一台主机进行通信了。如果要和多个不同的主机进行通信,就得创建多个socket。

DatagramSocket这个类提供了两个构造方法:

计算机网络--网络编程(1)

一个是无参构造方法,相当于只是创建了一个socket,另外一个需要传入一个端口号。 此时就是让当前的socket对象和这个指定的端口,关联起来。无参构造也会分配一个端口号,不过是系统自动分配空闲的端口号。


计算机网络--网络编程(1)

 这两个方法的参数是一个DatagaramPacket.这也是一个类,先来介绍下:

DatagramPacket API  类表示UDP中传输的一个报文。发送方法就是把这个创建好的报文对象发送出去。接收方法的参数是一个空的对象,在receive的内部会对参数的这个空对象进行内容的填充。

计算机网络--网络编程(1)

用于释放资源的。


DatagramPacket这个类也提供了2个构造方法:

DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)

 第一个构造方法相当于设置好了一个缓冲区。

第二个构造方法既构造了一个缓冲区又构造了一个地址。


基于这两个API,构造一个最简单的UDP客户端服务器程序。

 服务器端的代码:

package network;
//Udp回显的服务器

import javax.imageio.IIOException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UdpEchoServer {
    //网络编程的本质是要操作网卡
    //网卡不好直接操作,因此操作系统把socket这样的文件抽象成了网卡
    //因此进行网络通信,势必先有一个socket对象。
    private DatagramSocket socket=null;
    //对于服务器来说,创建socket对象的同时,要让他绑定上一个具体的端口号
    public UdpEchoServer(int port) throws SocketException {
        socket =new DatagramSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动!!");
        while (true){
            //并不知道有多少个客户端想建立链接,因此写个循环
            //只要有客户端过来,就可以提供服务
            //1.读取客户端发来的请求是啥
            //receive方法,需要一个空白DatagramPacket对象,交给receive来进行填充。填充的数据来自于网卡
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            //此时这个DatagramPacket是一个特殊的对象,并不方便直接处理,可以把这里包含的数据拿出来,构成一个字符串
            String request=new String(requestPacket.getData(),0,requestPacket.getLength());
            //2.根据请求计算响应,由于此处是回显服务器,响应和请求相同。
            String response=process(request);
            //3.把回显写回到客户端,send参数也是DatagramPacket 需要把这个Packet对象构造好
            DatagramPacket responsePacket =new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());
            socket.send(responsePacket);
            //4.打印请求响应的处理中间结果
            System.out.printf("[%s:%d] req: %s; resp:%s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),
                    request,response);


        }

    }
    //这个方法表示根据请求计算响应
    public String process(String request){
        return request;


    }

    public static void main(String[] args) throws IOException {
       UdpEchoServer server=new UdpEchoServer(9090);
          server.start();

    }

}

这里我们用while循环实现了一直等待客户端发送请求这么一个过程。假设客户端不停的发送请求,并且请求的频率非常快。我这个服务器是否就忙不过来处理了呢?这个情况是很可能出现的。那么解决的方法就是高并发执行。好比我开了一家餐馆,生意不好的时候,我一个人绰绰有余。但是生意非常好。我一个人忙不过来,这个时候我雇了2个人来帮忙。这就是高并发的原理。那么高并发是如何实现呢。那就是通过多线程实现。一个核心一个线程的并发执行。效率就会高很多。但是硬件设施终有上限。那么通过加机器也就就解决这个硬件问题了。


客户端的代码:

package network;

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

//Udp回显客户端
public class UdpEchoClient {
    private DatagramSocket socket=null;
    private String serverIp=null;

    private int serverPort=0;
    public UdpEchoClient (String serverIp,int serverPort) throws SocketException {
        socket =new DatagramSocket();
        this.serverIp=serverIp;
        this.serverPort=serverPort;


    }
    public void start()throws IOException {
        System.out.println("客户端启动!");
        Scanner scanner=new Scanner(System.in);
        while (true) {
            //1.从控制台读取要发送的数据
            System.out.print("> ");
            String request =scanner.next();
            if(request.equals("exit")){
                System.out.println("goodbye");
                break;
            }
            //2.构造成UDP请求,并发送,构造这个Packet的时候,需要传入serverIp和port,此处的IP地址是需要一个32位的整数形式
            //而上述的IP是一个字符串,所以需要进行转换
            DatagramPacket requestPacket =new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(serverIp),serverPort);
            socket.send(requestPacket);
            //3.读取服务器的UDP请求,并解析
            DatagramPacket responsePacket =new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            String response =new String(responsePacket.getData(),0,responsePacket.getLength());
            //4.解析结果显示出来
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException{
        UdpEchoClient client =new UdpEchoClient("127.0.0.1",9090);
        client.start();

    }
}

首先启动我们的服务器:

计算机网络--网络编程(1)

就会进入等待请求的状态。

再启动服务器:

计算机网络--网络编程(1) 我们输入一个hello;

计算机网络--网络编程(1)

 服务器就会给我们回一个hello。我们再看服务器那边:

计算机网络--网络编程(1)

收到了客户端的的IP地址端口号。以上就是实现了一个简单的回显服务器和客户端。

 文章来源地址https://www.toymoban.com/news/detail-508785.html

到了这里,关于计算机网络--网络编程(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机网络---网络编程套接字(一)

    ✨ 计算机网络—网络编程套接字之UDP数据报套接字编程 作者介绍: 🎓作者:偷偷敲代码的青花瓷🐱‍🚀 👀作者的Gitee:代码仓库 📌系列文章推荐:计算机网络 ——网络原理之初识 ✨✨我和大家一样都是热爱编程✨,很高兴能在此和大家分享知识,希望在分享知识的同时,能和大

    2023年04月09日
    浏览(36)
  • 【计算机网络】网络编程套接字(一)

    目录 1.预备知识 1.1.理解源IP地址和目的IP地址 1.2.认识端口号 1.2.1.理解\\\"端口号\\\"和\\\"进程ID\\\" 1.2.2.理解源端口号和目的端口号 1.3.认识TCP/UDP协议 1.3.1.TCP协议 1.3.2.UDP协议 1.4.网络字节序 网络字节序和主机字节序的转换 2.socket编程接口 2.1.sockaddr结构 struct sockaddr_in 的具体结构: 2.

    2024年02月08日
    浏览(50)
  • 【计算机网络】网络编程套接字(二)

    简单TCP服务器实现 我们将会使用到的头文件放在 comm.h 文件中 创建套接字 创建过程和UDP服务器几乎完全一样,除了使用的是TCP服务器使用的是流式服务(SOCK_STREAM),UDP使用的是数据包服务(SOCK_DGRAM) 服务器绑定 绑定的过程和UDP服务器也是相同的,可以看着复习一下 定义好 st

    2024年02月13日
    浏览(43)
  • 【计算机网络】Socket编程

    IP地址:公网IP,用于唯一标识互联网中的一台主机 源IP,目的IP:对于一个报文来讲,从哪来,到哪去。 源IP指将数据发送过来的IP地址,目的IP指将数据发送给下一个设备的IP地址(mac地址的变化) 意义: 指导一个报文该如何进行路径选择,目的IP是让我们根据目标进行路径选

    2024年02月08日
    浏览(47)
  • 【计算机网络】socket编程基础

    因特网上的每台计算机都有一个唯一的IP地址,如果一台主机上的数据要传输到另一台主机,那么对端主机的IP地址就应该作为该数据传输时的目的IP地址。但仅仅知道目的IP地址是不够的,当对端主机收到数据后,对端还需要对该主机作出相应,因此对端主机也需要发送数据

    2024年02月15日
    浏览(47)
  • 计算机网络技术与JAVA网络编程URL编程-----JAVA入门基础教程-----计算机网络经典

    import org.junit.jupiter.api.Test; import java.io.*; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class URLTest { public static void main(String[] args) { //URL:统一资源定位符(种子),一个URL就定位着互联网上某个资源的地址 //http:应用层协议,IP地址,端口号,资源地址,参数

    2024年02月15日
    浏览(57)
  • 计算机网络技术与JAVA网络编程UDP编程-----JAVA入门基础教程-----计算机网络经典

    import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.*; public class UDP { public static void main(String[] args) { DatagramSocket datagramSocket = null; try { datagramSocket = new DatagramSocket(); InetAddress inetAddress = InetAddress.getByName(\\\"127.0.0.1\\\"); int port = 9090; byte[] byte

    2024年02月15日
    浏览(49)
  • 09.计算机网络——套接字编程

    ​ 内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分。 ​ TCP/IP协议规定,网络数据流应采用 大端字节序 ,即低地址高字节。不管这台主机是大端机还是小端机, 都会

    2024年02月16日
    浏览(47)
  • 【计算机网络】网络编程接口 Socket API 解读(8)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。        本文主要描述

    2024年02月08日
    浏览(44)
  • 【计算机网络】网络编程接口 Socket API 解读(11)

             Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。         本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。 遵循 POSIX.1-2008      

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包