tcp简单例子(客户端通过键盘输入运算(加减乘除)发送给服务器,服务器接收后计算并返回计算结果)

本次实验旨在理解和掌握TCP协议的基本原理,以及在Java中使用Socket和ServerSocket类实现客户端-服务器通信。实验中,客户端输入运算表达式,服务器接收到请求后计算并返回结果。实验加深了对客户端服务器模型的理解,巩固了Java的相关方法如split(), parseInt()和valueOf()等。
摘要由CSDN通过智能技术生成

基于TCP的Socket网络编程应用实验报告

1.1 实验目的
  1. 了解tcp的基本原理。
  2. 熟悉java中的socket,serversocket类的使用 。
  3. 创建最简单的服务器,客户端交互系统。
1.2 实验要求
  1. 上机实验应二人一组,独立实验。
  2. 上机过程中出现的问题,除了是系统的问题以外,不要轻易举手问老师。
  3. 尤其对“出错信息”,应善于分析判断,找出出错的行,然后检查该行或其上一行。
1.3 实验内容

客户端通过键盘输入运算(加减乘除)发送给服务器,服务器接收后计算并返回计算结果。

1.4 思路分析
1.4.1 ClientTCP 类

1.创建 Socket ( ip , port ) , 确定连接到哪里.
2.通过Scoket,获取字符流
3.通过键盘,获取输入的字符流
4.读取用户输入命令
5.向服务器端发送一条消息

1.4.2 ServerTCP 类

1.创建 ServerSocket对象,绑定端口,开始等待连接
2.接收连接 accept 方法, 返回 socket 对象
3.接收客户端发送的消息,启动线程计算

1.4.3Compute 类

1.定义一个splits()方法,将读取到客户端的消息进行处理并返回处理结果
2.split()方法会以运算符号为字符分隔符,结果以字符串数组形式返回给s
3.Integer.parseInt(String)将String字符类型数据转换为Integer整型数据,parseInt(String s,int radix)的目的是输出一个十进制数,
就是求“int radix”进制数“String s”的十进制数是多少。
4.String.valueOf()由基本数据型态转换成 String
5.重写run
6.获取客户端输入流
7.读取客户端发送来的消息
8.输出计算结果
9.输入exit时结束

1.5 实验代码
1.5.1定义ClientTCP 类
package com.xiaoguoplus.Demo02;
import java.io.*;
import java.net.Socket;
import java.util.Date;
public class ClientTCP  {
    public static void main(String[] args) throws Exception {
        // 1.创建 Socket ( ip , port ) , 确定连接到哪里.
        Socket client = new Socket("localhost", 6666);
        System. out. println("客户端: "+client. getInetAddress () . getLocalHost() +"已连接到服务器");


        // 2.通过Scoket,获取字符流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        //3.通过键盘,获取输入的字符流
        BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in,"UTF-8"));

        while (true) {
            System.out.println("客户端发送数据:");
            //4.读取用户输入命令
            String sendMess = keyReader.readLine();
            //5.向服务器端发送一条消息
            bw.write(sendMess + "\n");
            bw.flush();

        }

    }
}
1.5.2定义服务器运行类ServerTCP
package com.xiaoguoplus.Demo02;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class ServerTCP {
    public static void main(String[] args) {
        // 1.创建 ServerSocket对象,绑定端口,开始等待连接
        ServerSocket ss;
        try {
            ss = new ServerSocket(6666);
            System.out.println("服务器启动...");
            while(true){
                // 2.接收连接 accept 方法, 返回 socket 对象.
                Socket server = ss.accept();
                //3.接收客户端发送的消息,启动线程计算
                Compute t1 = new Compute (server) ;
                t1.start();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
1.5.3定义compute类
package com.xiaoguoplus.Demo02;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Date;

public class Compute extends Thread {

    private Socket socket;

    public Compute(Socket socket) {
        this.socket = socket;
    }
    //1.定义一个splits()方法,将读取到客户端的消息进行处理并返回处理结果
    //2.split()方法会以运算符号为字符分隔符,结果以字符串数组形式返回给s
    //3.Integer.parseInt(String)将String字符类型数据转换为Integer整型数据,parseInt(String s,int radix)的目的是输出一个十进制数,
    // 就是求“int radix”进制数“String s”的十进制数是多少。
    //4.String.valueOf()由基本数据型态转换成 String
    public static String splits(String str) {
        String[] s;
        if ((s = str.split("\\+")).length > 1) return String.valueOf(Integer.parseInt(s[0]) + Integer.parseInt(s[1]));
        if ((s = str.split("\\-")).length > 1) return String.valueOf(Integer.parseInt(s[0]) - Integer.parseInt(s[1]));
        if ((s = str.split("\\*")).length > 1) return String.valueOf(Integer.parseInt(s[0]) * Integer.parseInt(s[1]));
        if ((s = str.split("\\/")).length > 1) return String.valueOf(Integer.parseInt(s[0]) / Integer.parseInt(s[1]));
        return "运算符输入有误!";
    }
//5.重写run
    public void run() {
        try {
            //6.获取客户端输入流
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            while (true) {
                //7.读取客户端发送来的消息
                String mess = br.readLine();
                //8.输出计算结果
                System.out.println("计算结果是:" + splits(mess));
                bw.write(mess + "\n");
                bw.flush();
                //9.输入exit时结束
                if (mess.compareToIgnoreCase("exit") == 0) {
                    break;
                }
            }
            bw.close();
            br.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

1.6 运行截图
服务器启动
在这里插入图片描述

客户端启动并输入运算表达式

在这里插入图片描述

服务器端
在这里插入图片描述

1.7 新的体会
1.下课后一直在做在想这道题,但是感觉有点棘手。通过百度了解一些内容知识,有了一些思路,就慢慢做出了。
2.Java语言确实强大,通过这道题又帮我巩固了以前遗忘的知识,比如split()方法,String.valueOf()方法, Integer.parseInt()方法,
3.通过这次实验报告,我对客户端服务器端又有了更深刻的认识。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值