客服端和服务器的原理高中生都知道,我还不懂-java网络编程技术

简介: 客服端和服务器的原理高中生都知道,我还不懂-java网络编程技术

在这里插入图片描述


👨‍💻个人主页@元宇宙-秩沅

**hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!**

本文由 秩沅 原创

收录于专栏 java

⭐⭐
-


@[TOC]

题目

编写一个程序,实现客户端与服务器玩猜数字游戏:客户端和服务器建立套接字连接后,服务器向客户端发送一个1-100的随机数,用户将自己猜测的数数字发送给服务器,服务器向用户发送信息“猜大了”“猜小了”“猜对了”。运行结果如下图所示:

在这里插入图片描述

👨‍💻客户端类


package Client;

import java.io.*;
import java.net.*;
import java.util.*;

//客户端
public class Client {
   
   

     public static void main(String[] args) {
   
   
        Scanner scanner = new Scanner (System.in);  
        Socket mysocket = null ;         //声明套接字对象
        InetAddress address = null ;     //声明地址
        InetSocketAddress socketAddress = null ; //声明连接套接字地址的对象
        DataInputStream  input  = null ;  //数据输入流
        DataOutputStream output = null ; //数据输出流
        Thread readData ;               //线程
        Read readMess = null ;
        //1.建立信息连接阶段
        try {
   
   
            String IP ;  //ip地址
            int port ;     //端口
            mysocket = new Socket(); 
            readMess = new Read();
            readData = new Thread(readMess);   //将继承了runnable接口的read 作为参数传递 ,创建了负责读取信息的线程
            System.out.print("输入服务器的IP:");
            IP = scanner.nextLine(); 
            System.out.print("输入端口号:");
            port = scanner.nextInt();
            //判断是否连接
            if(mysocket.isConnected()) System.out.println("连接成功!");
            else {
   
   
                 address = InetAddress.getByName(IP);                     //获取服务的地址信息
                 socketAddress = new InetSocketAddress(address ,port);    //参数为服务器的地址信息和端口
                 mysocket.connect(socketAddress);                         //和网址信息进行连接
                 input = new DataInputStream (mysocket.getInputStream()); //将套接字对象得到的输入流流到"输入流大管道"
                 output =  new DataOutputStream (mysocket.getOutputStream()); //将套接字对象得到的输出流流到"输出流大管道"
                 readMess.setDataInputStream(input);                          //调用read里面的方法将输入流的信息传递
                 readData.start();                                             //启动读取数据的线程
            }
        }
        catch(Exception e)
        {
   
   
            System.out.println("服务器已断开"+ e);
        }
        //2.信息互动阶段
        System.out.println("请输入你的猜测结果:");
        while(scanner.hasNext()) //有输入就返回true
        {
   
   
            int gess = 0 ;
            try {
   
   
                gess = scanner.nextInt();   //赋予输入的信息
            }
            catch(InputMismatchException e)
            {
   
   
                System.exit(0);             //如有异常退出程序
            }
            //向服务器发送信息
            try {
   
   
                output.writeInt(gess);      //将猜测的结果发给服务器
            }
            catch(Exception e ) {
   
   }
        } 
    }
}

👨‍💻Read类


package Client;

import java.io.*;

//Read类
public class Read implements Runnable {
   
    

      DataInputStream input ;    //设置数据输入流大管道
      public void setDataInputStream( DataInputStream input) {
   
     
          this.input = input ;  //将从客户端得到的输入信息作为参数传递到Read类的输入信息管道内
      }
      @Override
     public void run() {
   
           //重写接口中的方法,该方法在线程启动时调用
         char result  ;
         while(true) {
   
   
             try {
   
   

                 result = input.readChar() ; //读取数据流中字符串信息
                 if(result=='D')
                 System.out.println("猜大了");
                 if(result=='X')
                 System.out.println("猜小了");
                 if(result=='P')
                 System.out.println("猜对了");
                 if(result=='L') {
   
    System.out.println("欢迎下次再来"); System.exit(0); }
                 System.out.println("请输入你的猜测结果:(按0退出客户端)");
             }
             catch(IOException e ) {
   
    
                 System.out.println("有异常,与服务器已断开"+ e);
                 break;
             }
         }
     }
    private void Switch() {
   
   
        // TODO Auto-generated method stub

    }

}

👨‍💻服务器类


package Client;

//服务器端
import java.io.*;
import java.net.*;
import java.util.Random;

public class Server {
   
   
             @SuppressWarnings("resource")
            public static void main(String[] args) {
   
   
                int port = 2022 ;                   //定义端口号  
                ServerSocket server = null ;        //作用是连接 两个端的Scoket对象
                ServerThread thread = null ;               //继承了Thread类的子类
                Socket boss = null ;
                while( true )
                {
   
   
                    try {
   
   
                        server = new ServerSocket(port); 
                    }
                    catch(IOException e)
                    {
   
   
                        System.out.println("正在进行监听中");
                    }
                    try {
   
   
                        System.out.println("即将建立连接");
                        boss = server.accept();         //将两个端口进行连接
                        System.out.println("连接成功,玩家的地址为:"+boss.getInetAddress());
                    }
                    catch(IOException e)
                    {
   
   
                        System.out.println("正在等待玩家连接");
                    }
                    //多线程服务
                    if(boss != null)
                      thread = new ServerThread(boss) ; //将服务端的套接口当参数传递进行有参构造
                      thread.start();                   //开启每个客户各拥有以和专门的线程,并调用run方法
                }

            }
}

class ServerThread extends Thread{
   
   

             Socket chakou ;
             DataOutputStream output = null ;
             DataInputStream   input = null ;
             ServerThread( Socket chakou )   //有参构造
             {
   
   
                 this.chakou = chakou ;
                 try {
   
   
                                        //获取传过来的套接口的输入输出管道中的数据
                     output = new DataOutputStream( chakou.getOutputStream());
                     input  = new DataInputStream(  chakou.getInputStream() );
                 }
                 catch(IOException e) {
   
    }
             }
             @Override
             public void run() {
   
         // 重写父类继承Runnable接口的方法 , 线程启动后会调用该方法

             while(true)
             {
   
   
                 try {
   
   
                       int gess = input.readInt();  //获取由客户端传来的数据流中整型的信息,既猜测的答案
                       Random R = new Random();
                       int a = R.nextInt(101)+1;  //生成 1到100的随机数
                       if(gess == 0)  output.writeChar('L');   //允许退出
                       if(gess > a)      output.writeChar('D'); //猜大了
                       else if(gess < a) output.writeChar('X'); //猜小了 
                       else              output.writeChar('P'); //猜对了
                 }
                 catch(IOException e  )
                 {
   
   
                     System.out.println("玩家已离开!");
                     return ;

                 }
             }

             }
}

你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!
请添加图片描述

目录
相关文章
|
14天前
|
存储 安全 网络安全
云计算与网络安全:技术融合的双刃剑
【10月更文挑战第40天】本文将深入探讨云计算与网络安全之间的关系,揭示它们如何相互依赖又互相挑战。我们将从云计算的基本概念出发,逐步引入网络安全的重要性,并分析云服务在提供便利的同时可能带来的安全隐患。文章还将讨论信息安全的关键领域,如加密技术和身份验证机制,以及如何在云计算环境中加强这些安全措施。通过本文,读者将获得对云计算和网络安全复杂关系的深刻理解,并认识到在享受技术便利的同时,维护网络安全的重要性。
|
20天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
20天前
|
Java
Java之CountDownLatch原理浅析
本文介绍了Java并发工具类`CountDownLatch`的使用方法、原理及其与`Thread.join()`的区别。`CountDownLatch`通过构造函数接收一个整数参数作为计数器,调用`countDown`方法减少计数,`await`方法会阻塞当前线程,直到计数为零。文章还详细解析了其内部机制,包括初始化、`countDown`和`await`方法的工作原理,并给出了一个游戏加载场景的示例代码。
Java之CountDownLatch原理浅析
|
22天前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
7天前
|
弹性计算 监控 数据库
制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程
本文通过一个制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程,展示了企业级应用上云的实践方法与显著优势,包括弹性计算资源、高可靠性、数据安全及降低维护成本等,为企业数字化转型提供参考。
34 5
|
11天前
|
监控 安全 网络安全
云计算与网络安全:探索云服务中的信息安全技术
【10月更文挑战第43天】本文将深入探讨云计算与网络安全的交汇点,重点分析云服务中的信息安全技术和策略。我们将从云计算的基础架构出发,逐步剖析网络安全的重要性,并介绍如何通过实施有效的安全措施来保护数据和应用程序。文章还将提供实用的代码示例,帮助读者更好地理解和应用这些安全技术。
28 4
|
14天前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域
【10月更文挑战第40天】随着互联网技术的不断发展,云计算已经成为了现代社会中不可或缺的一部分。然而,云计算的普及也带来了一系列的安全问题。本文将探讨云计算与网络安全之间的关系,包括云服务、网络安全、信息安全等领域。我们将通过代码示例来展示如何保护云计算环境中的敏感信息和数据。最后,我们将总结云计算与网络安全之间的紧密联系,并展望未来的发展趋势。
|
15天前
|
云安全 安全 网络安全
云计算与网络安全:技术挑战与解决策略
【10月更文挑战第39天】随着云计算技术的飞速发展,网络安全问题也日益凸显。本文将探讨云计算环境下的网络安全挑战,并提出相应的解决策略。通过分析云服务模型、网络安全威胁以及信息安全技术的应用,我们将揭示如何构建一个安全的云计算环境。
|
15天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
48 2
|
16天前
|
云安全 安全 网络安全
云计算与网络安全:技术融合的未来之路
【10月更文挑战第38天】 在数字化浪潮中,云计算和网络安全成为支撑现代企业和个人数据安全的两大基石。本文将深入探讨云计算服务如何与网络安全技术相结合,保障信息安全,并分析面临的挑战及未来发展趋势。我们将通过实际案例,揭示云安全的最佳实践,为读者提供一条清晰的技术融合路径。