基于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.通过这次实验报告,我对客户端服务器端又有了更深刻的认识。