👨💻个人主页:@元宇宙-秩沅
**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 ;
}
}
}
}
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!