基于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
{
Socket client
= new Socket("localhost", 6666);
System
. out
. println("客户端: "+client
. getInetAddress
() . getLocalHost() +"已连接到服务器");
BufferedWriter bw
= new BufferedWriter(new OutputStreamWriter(client
.getOutputStream()));
BufferedReader keyReader
= new BufferedReader(new InputStreamReader(System
.in
,"UTF-8"));
while (true) {
System
.out
.println("客户端发送数据:");
String sendMess
= keyReader
.readLine();
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
) {
ServerSocket ss
;
try {
ss
= new ServerSocket(6666);
System
.out
.println("服务器启动...");
while(true){
Socket server
= ss
.accept();
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
;
}
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 "运算符输入有误!";
}
public void run() {
try {
BufferedReader br
= new BufferedReader(new InputStreamReader(socket
.getInputStream()));
BufferedWriter bw
= new BufferedWriter(new OutputStreamWriter(socket
.getOutputStream()));
while (true) {
String mess
= br
.readLine();
System
.out
.println("计算结果是:" + splits(mess
));
bw
.write(mess
+ "\n");
bw
.flush();
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.通过这次实验报告,我对客户端服务器端又有了更深刻的认识。