java利用多线程和Socket实现猜拳游戏

本文实例为大家分享了利用多线程和Socket实现猜拳游戏的具体代码,供大家参考,具体内容如下

实例:猜拳游戏

猜拳游戏是指小时候玩的石头、剪刀、布的游戏。客户端与服务器的“较量”,服务器会自动随机产生出石头、剪刀或者布,客户端则由用户输入石头、剪刀、布之一,然后服务器通过比较告知比较结果。比如,客户端出石头,而服务器出的是剪刀,那么,服务器就会告知客户端,用户赢了。猜拳游戏也要制作一个多线程的程序,让多个客户端能够共同参与游戏。在该程序中,要包括猜拳的业务逻辑的线程类、客户端类、服务器类。

根据实例的要求,猜拳游戏的业务逻辑线程类的代码如下。

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Random;

/**
 * @author MNH
 * @version 1.0
 * @project Name: JavaSenior
 * @file Name: PlayThread
 * @desc 功能描述
 * @date 2020/8/19
 * @time 8:53
 * @by IDE: IntelliJ IDEA
 */
public class PlayThread implements Runnable{
 Socket s;
 InputStream is=null;
 OutputStream os=null;
 public PlayThread(Socket s){
  this.s=s;
 }

 @Override
 public void run() {
  try {
   is = s.getInputStream();
   os = s.getOutputStream();

   DataOutputStream dos = new DataOutputStream(os);
   DataInputStream dis = new DataInputStream(is);
   Random rd = new Random(3);//0代表石头,1代表剪刀,2代表布
   while (true) {
    int random = rd.nextInt();
    int number = dis.readInt();
    if (number == 3) {
     System.out.println("客户端退出");
     break;
    }
    int rs = -1;//1代表获胜,2代表失败,3代表平局
    if (random == 0) {
     if (number == 1) {
      rs = 2;
     } else if (number == 2) {
      rs = 1;
     } else {
      rs = 3;
     }
    } else if (random == 1) {
     if (number == 0) {
      rs = 1;
     } else if (number == 2) {
      rs = 2;
     } else {
      rs = 3;
     }
    } else {
     if (number == 0) {
      rs = 2;
     } else if (number == 1) {
      rs = 1;
     } else {
      rs = 3;
     }
    }
    dos.writeInt(rs);
    dos.flush();
   }
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 public void close(){
  try{
   is.close();
   os.close();
  }catch (Exception e){
   e.printStackTrace();
  }
 }
}

上面的代码实现了客户端的输入,并将判断结果反馈给服务器的操作。服务器端直接调用该线程即可,实现代码如下。

import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author MNH
 * @version 1.0
 * @project Name: JavaSenior
 * @file Name: PlayServer
 * @desc 功能描述
 * @date 2020/8/19
 * @time 9:30
 * @by IDE: IntelliJ IDEA
 */

public class PlayServer {
 public static void main(String[] args) {
  ServerSocket ss=null;
  System.out.println("服务器启动......");
  try{
   ss=new ServerSocket(4567);
   while(true){
    Socket s=ss.accept();
    new Thread(new PlayThread(s)).start();//启动线程
   }
  }catch (Exception e){
   e.printStackTrace();
  }finally {
   try{
    ss.close();
   }catch (Exception e){
    e.printStackTrace();
   }
  }
 }
}

最后,客户端的作用就是从控制台获取用户输入的选择,然后,将用户输入的值传递给服务器,再从服务器中获取反馈的结果输出到控制台上即可。客户端的代码如下。

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class PlayClient {
 public static void main(String[] args) {
  InputStream is=null;
  OutputStream os=null;
  Socket s=null;
  try{
   s=new Socket("127.0.0.1",4567);
   is=s.getInputStream();
   os=s.getOutputStream();
   while(true) {
    DataInputStream dis = new DataInputStream(is);
    DataOutputStream dos = new DataOutputStream(os);
    System.out.println("欢迎来到猜拳游戏");
    System.out.println("请选择:");
    System.out.println("0:石头");
    System.out.println("1:剪刀");
    System.out.println("2:布");
    System.out.println("3:退出");
    Scanner sc=new Scanner(System.in);
    int choose=sc.nextInt();
    if(choose>=0&&choose<=2){
     dos.writeInt(choose);
     dos.flush();
    }else if(choose==3){
     dos.writeInt(choose);
     dos.flush();
     System.out.println("游戏结束!");
     break;
    }else{
     System.out.println("输入错误,请重新输入");
    }
    int rs=dis.readInt();//获取判断结果 1代表获胜,2代表失败,3代表平局
    if(rs==1){
     System.out.println("本局比赛获胜");
    }else if(rs==2){
     System.out.println("本局比赛失败");
    }else{
     System.out.println("本局比赛平局");
    }
   }

  }catch(Exception e){
   e.printStackTrace();
  }finally {
   try{
    is.close();
    os.close();
    s.close();
   }catch (Exception e){
    e.printStackTrace();
   }
  }
 }
}

至此,基本的猜拳游戏程序就编程完成了。有兴趣的小伙伴还可以在其中加入猜拳输赢的次数统计等功能。在运行上面的程序时,服务器端会一直处于运行的状态,等待客户端的连接。当有客户端退出时,会在服务器端的控制台上打印“客户端退出”。

客户端的运行效果如下。

如有错误,请各位给予指正。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java中的多线程一定就快吗?

    并发编程与多线程编程 要了解并发编程,首先要懂得与并行这个概念进行区分.并行是指两个事件同时进行,并发是CPU切换速度快,看起来像是每个任务同时进行一样.多线程是实现并发编程的一种方式,假设一个场景,在广州地铁高峰时段,一群人涌进地铁里,在不同的闸机口刷卡进去.在这个场景里,进地铁就是任务,每个人可以看出是并发的,而多个刷卡闸机口就是多线程.   并发编程的本质目的是为了充分利用CPU,让程序运行得更快.然而,并不是启动更多的线程就能让程序最大限度地并发执行.在进行并发编程时,如果希望通过多线程

  • Java多线程锁机制相关原理实例解析

    上下文:程序运行需要的环境(外部变量) 上下文切换:将之前的程序需要的外部变量复制保存,然后切换到新的程序运行环境 系统调用:(用户态陷入操作系统,通过操作系统执行内核态指令,执行完回到用户态)用户态--内核态--用户态:两次上下文切换 线程wait()方法:将自身加入等待队列,发生了一次上下文切换 notify()方法:将线程唤醒,也发生了上下文切换 Java线程中的锁:偏向锁.轻量级锁.重量级锁. 注意:偏向锁和轻量级锁都没有发生竞争,重量级锁发生了竞争. 偏向锁:可重入和经常使用某一个线程

  • 浅析 Java多线程

    什么是进程 当一个程序进入内存中运行起来它就变为一个进程.因此,进程就是一个处于运行状态的程序.同时进程具有独立功能,进程是操作系统进行资源分配和调度的独立单位. 什么是线程 线程是进程的组成部分.通常情况下,一个进程可拥有多个线程,而一个线程只能拥有一个父进程. 线程可以拥有自己的堆栈.自己的程序计数器及自己的局部变量,但是线程不能拥有系统资源,它与其父进程的其他线程共享进程中的全部资源,这其中包括进程的代码段.数据段.堆空间以及一些进程级的资源(例如,打开的文件等). 线程是进程的执行单元,

  • Java Lambda表达式原理及多线程实现

    1.使用Lambda表达式实现多线程 public static void main(String[] args) { //使用匿名内部类的方式,实现多线程 new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "新线程创建了!"); } }).start(); //使用Lambda表达式,实现多线程 new Thre

  • Java实现多线程轮流打印1-100的数字操作

    首先打印1-100数字如果用一个单线程实现那么只要一个for循环即可,那么如果要用两个线程打印出来呢?(一个线程打印奇数,一个线程打印偶数)于是大家会想到可以通过加锁实现,但是这样的效率是不是不高?这里我用一个变量来控制两个线程的输出 public class ThreadTest { volatile int flag=0; public void runThread() throws InterruptedException{ Thread t1=new Thread(new Thread1

  • Java多线程CAS操作原理代码实例解析

    CAS操作号称无锁优化,也叫作自旋:对于一些常见的操作需要加锁,然后jdk就提供了一些以Atomic开头的类,这些类内部自动带了锁,当然这里的锁并非是用synchronized来实现的,而是通过CAS操作来实现的: 一.下面是 AtomicInteger 的使用: package com.designmodal.design.juc01; import java.util.ArrayList; import java.util.List; import java.util.concurrent.

  • Java 多线程传值的四种方法

    其实大家都知道多线程传值有三种方式: 1:通过构造方法传递数据 2:通过变量和方法传递数据 3:通过回调函数传递数据 那么博主有个非常变态的需求,所以找出了第四种实现方式,先看效果图: 动态Cron4j调度器,我曾经发过类似的文章,可以去搜索一下. 点击执行走下边的代码,然后根据类名反编译 public static void executeCron4j(String packageClass){ try { Object taskObj = classNewInstance(packageCl

  • Java多线程通信:交替打印ABAB实例

    使用wait()和notify()实现Java多线程通信:两个线程交替打印A和B,如ABABAB public class Test { public static void main(String[] args) { final PrintAB print = new PrintAB(); new Thread(new Runnable() { public void run(){ for(int i=0;i<5;i++) { print.printA(); } } }).start(); n

  • Java多线程中Lock锁的使用总结

    多核时代 摩尔定律告诉我们:当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍.换言之,每一美元所能买到的电脑性能,将每隔18个月翻两倍以上.然而最近摩尔定律似乎遇到了麻烦,目前微处理器的集成度似乎到了极限,在目前的制造工艺和体系架构下很难再提高单个处理器的速度了,否则它就被烧坏了.所以现在的芯片制造商改变了策略,转而在一个电路板上集成更多的处理器,也就是我们现在常见的多核处理器. 这就给软件行业带来麻烦(也可以说带来机会,比如说就业机会,呵呵).原来的情况

  • 浅谈java多线程编程

    一.多线程的优缺点 多线程的优点: 1)资源利用率更好 2)程序设计在某些情况下更简单 3)程序响应更快 多线程的代价: 1)设计更复杂 虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂.在多线程访问共享数据的时候,这部分代码需要特别的注意.线程之间的交互往往非常复杂.不正确的线程同步产生的错误非常难以被发现,并且重现以修复. 2)上下文切换的开销 当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据

随机推荐