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

    科技2024-07-21  67

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

    1.1 实验目的
    了解tcp的基本原理。熟悉java中的socket,serversocket类的使用 。创建最简单的服务器,客户端交互系统。
    1.2 实验要求
    上机实验应二人一组,独立实验。上机过程中出现的问题,除了是系统的问题以外,不要轻易举手问老师。尤其对“出错信息”,应善于分析判断,找出出错的行,然后检查该行或其上一行。
    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.通过这次实验报告,我对客户端服务器端又有了更深刻的认识。

    Processed: 0.009, SQL: 8