
学院(系)名称:计算机与通信工程学院
| 姓名 | 刘强 | 学号 | 20126*** | 专业 | 计算机科学与技术(中加) | |||
| 班级 | 教学2班 | 实验项目 | 基于TCP and UDP的socket编程 | |||||
| 课程名称 | 计算机网络 | 课程代码 | 0662016 | |||||
| 实验时间 | 2015年4月30日 第7、8节 | 实验地点 | 7-215 | |||||
| 批改意见 | 成绩 | |||||||
| " 教师签字: | ||||||||
(一)实验目的: 熟悉和掌握socket编程的基本理论和方法。掌握基于TCP和UDP的工作原理以及Socket编程的一般方法,能够编写简单的网络应用程序。 (二)实验环境: 软件环境:Windows 2000/XP / Eclipse 硬件环境:IBM-PC或兼容机 局域网、PC机连入Internet (三)实验学时: 2学时,必做. (四)实验内容: 利用Java或C++语言,分别基于TCP和UDP编写一个简单的Client/Server网络应用程序。要求实现客户向服务器传输任意一个字符串,服务器将收到的字符串变换成大写后传回客户。 (五)实验要求: 每位同学上机编程实验,实验指导教师现场指导。程序可参考附录的程序1、程序2、程序3和程序4(程序中有错误需完善)。在实验报告中要说明Socket编程的客户端和服务器端主要步骤、利用Java语言用到的主要类及其主要作用、TCP和UDP编程的主要差异和特点、你所实现的文件传输的程序代码、实验过程和实验结果。 (六)实验步骤: 程序代码: TCP Client: package tcpClient; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.Socket; public class tcpClient {
声明字符串变量用于存储字符串输入和传送 从服务器得到,并送到用户标准输出 请输入要转换的字符串:"); 为定义的套接字 创建inFromUser程序的输入流 将流连接到标准输入 包含在java.io.*包中 clientSocket.getOutputStream()); BufferedReader inFromServer = // inFromServer 连接套接字的输入流 包含在java.io.*包中 clientSocket.getInputStream())); 将用户输入的一行 读入到sentence中 程序的输出流 当到达服务器时,他们进入modifiedSentence字符串中 将服务器返回来的 打印到监视器上 关闭套接字,tcp连接也随之关闭
} TCP Server: package tcpServer; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; class server {
声明字符串变量用于存储字符串输入和传送 从从客户端得到 创建welcomeSocket对象,在8579端口进行监听 while (true) { 获取从客户端传来的字符 BufferedReader infromClient = new BufferedReader( 包含在java.io.*包中 connectionSocket.getInputStream())); 程 序的输出流 new DataOutputStream(connectionSocket.getOutputStream()); 把用户输入的送入clientSentence中 将发送行中的小写转换成大写 outToClient.writeBytes(capitalizedSentence); }
} 执行结果: UDP Client: package udpClient; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class udpClient {
请输入要转换的字符串:"); BufferedReader inFromUser = new BufferedReader(new InputStreamReader( 创建输入流,用于输入字符串 创建一个DatagramSocket 对象 创建一个InetAddress byte[] sendData = new byte[1024]; // 创建字节数组 byte[] receiveData = new byte[1024]; 读取输入的字符 将字符串转化为字节数组 创建DatagramPacket 对象, 指定其发送地址和端口号 sendData.length, IPAddress, 8876); 调用 socket 对象的 send()方法发送数据 DatagramPacket receivePacket = new DatagramPacket(receiveData, 创建 DatagramPacket 对象, 用于接收数据 调用 socket 对象的 receive()方法接收数据 String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); 关闭客户端socket连接
} UDP Server: package udpServer; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class udpServer {
@SuppressWarnings("resource") 创建一个DatagramSocket 对象,指定端口为8876 byte[] receiveData = new byte[1024]; // 创建字节数组 byte[] sendData = new byte[1024]; while (true) { receiveData.length); // 创建一个空DatagramPacket对象 使用 receiver 方法接手客户端所发送到数据, 如果客户端没有发送数据, 进程阻塞 String sentence = new String(receivePacket.getData()); 获取Client端IP地址 获取Client端端口号 将字符串转化成大写字母 sendData = capitalizedSentence.getBytes(); 创建DatagramPacket 对象, // 指定其发送地址和端口号 sendData.length, IPAddress, port); 调用 socket 对象的 send()方法发送数据 }
} 执行结果: 实验体会: (1) Datagram Sockets:数据包socket,一般传输方式为UDP (2) Stream Sockets:流socket,一般传输方式为TCP Java通过两个类DatagramSocket和DatagramPacket来支持但Datagram socket(UDP)。Datagram Socket不真正区分Server和Client,既可以用来写server,也可以写client。但对于java中的Socket类和ServerSocket类就只能分别来写客户端和服务器端(同时支持TCP与UDP,更Socket(String host,int port,boolean stream)构造方法中的stream即可)。 | ||||||||
