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 ;

                 }
             }

             }
}

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

目录
相关文章
|
5月前
|
监控 Cloud Native Java
Quarkus 云原生Java框架技术详解与实践指南
本文档全面介绍 Quarkus 框架的核心概念、架构特性和实践应用。作为新一代的云原生 Java 框架,Quarkus 旨在为 OpenJDK HotSpot 和 GraalVM 量身定制,显著提升 Java 在容器化环境中的运行效率。本文将深入探讨其响应式编程模型、原生编译能力、扩展机制以及与微服务架构的深度集成,帮助开发者构建高效、轻量的云原生应用。
600 44
|
5月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
535 1
|
6月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
194 4
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
246 1
|
4月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
260 1
|
4月前
|
机器学习/深度学习 人工智能 监控
上海拔俗AI软件定制:让技术真正为你所用,拔俗网络这样做
在上海,企业正通过AI软件定制破解通用化难题。该模式以业务场景为核心,量身打造智能解决方案,涵盖场景化模型开发、模块化架构设计与数据闭环优化三大技术维度,推动技术与业务深度融合,助力企业实现高效、可持续的数字化转型。
149 0
|
4月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
450 0
|
6月前
|
Java 测试技术 API
2025 年 Java 开发者必知的最新技术实操指南全览
本指南涵盖Java 21+核心实操,详解虚拟线程、Spring Boot 3.3+GraalVM、Jakarta EE 10+MicroProfile 6微服务开发,并提供现代Java开发最佳实践,助力开发者高效构建高性能应用。
927 4
|
5月前
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
349 0
|
5月前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
385 0

热门文章

最新文章