广州大学学生实验报告
开课学院及实验室:计算机科学与工程实验室 学院 计算机科学与教育软件学院 2014年12月05日 姓名 学号 年级/专业/班 实验课程名称 实验项目名称
Java语言 综合应用实验 成绩 指导老师 樊志平 一、实验目的
实验十三 网络编程(1)
1. 掌握使用Socket类的属性和基本方法, 2. 掌握使用ServerSocket类的方法
实验十四 网络编程(2)
1. 掌握使用DatagramSocket类的属性和基本方法, 2. 掌握使用DatagramPacket类的方法
二、实验器材 1.MacBook Pro一台 2.操作系统:OS X Yosemite 3.编程软件:eclipse 三、实验内容及原理
实验十三 网络编程(1)
1. 掌握使用使用Socket、ServerSocket类的方法。
一.使用Socket、ServerSocket
服务器端程序设计模型
(1) 在服务器端,先创建类ServerSocket的实例对象,注册在服务器端进行连接的端口号以及
允许连接的最大客户数目。
(2) 调用类ServerSocket的成员方法accept来等待客户端的连接,当有客户端与服务器端建立
连接时,accept方法将返回连接通道在服务器端的套接字。通过该套接字可以与客户端进行数据通信
(3) 调用类Socket的成员方法getInputStream和getOutputStream获得该套接字所
对应的输入流(InputStream)和输出流(OutputStream)
(4) 通过输入流(InputStream)和输出流(OutputStream)与客户端进行数据通信,处
理从客户端获得的数据以及需要向客户端发送数据
(5) 通信完毕后,关闭输入流和输出流和套接字 客户端
(1) 创建类Socket的实例对象,与服务器建立连接,在建立实例对象时须指定服务器端的主
机名和端口号,主机名和端口号必须完全匹配才能建立连接
(2) 调用类Socket的成员方法getInputStream和getOutputStream获得该套接字所
对应的输入流(InputStream)和输出流(OutputStream)
(3) 通过输入流(InputStream)和输出流(OutputStream)与客户端进行数据通信,处
理从客户端获得的数据以及需要向客户端发送数据
(4) 通信完毕后,关闭输入流和输出流和套接字
实验十四 网络编程(2)
1.掌握使用使用DatagramSocket、DatagramPacket类的方法。
一 使用DatagramSocket、DatagramPacket
(1) 在服务器端,先创建类DatagramSocket的实例对象,注册在服务器端进行连接的端口
号。等待客户程序的请求
(2) 创建据报的缓冲区,调用DatagramPacket创建接受数据包
(3) 调用类DatagramSocket的成员方法receive来接受客户端的数据,并获取客户端IP地
址和端口
(4) 创建包含发送数据和向给定IP地址和端口发送的应答数据包; (5) 调用类DatagramSocket的成员方法send来发送数据报 (6) 通信完毕后,关闭UDPDaytimeServer并退出; 客户端
(1) 创建类DatagramSocket的实例对象
(2) 创建请求和应答缓冲区,调用DatagramPacket创建发送数据包,在创建数据包时须指
定服务器端的主机名和端口号,和需要发送的数据与数据长度
(3) 调用类DatagramSocket的成员方法send来发送请求 (4) 调用类DatagramSocket的成员方法receive来接受数据报 (5) 通信完毕后,关闭输入流和输出流和套接字
四、实验过程原始数据记录
实验十三 网络编程(1)
1.使用ServerSocket编写一个时间服务器程序,它能够向客户程序发送以下格式的时间信息。
时间格式为:Sat Jan 15 10:45:20 CST 2005
(1) 服务器端
JTimeServer.java
import java.net.*; import java.io.*; import java.util.*;
public class DaytimeServer{
public static void main(String[] args){ ServerSocket timeSocket; Socket clientSocket; OutputStream out;
Date currDate; if(args.length<1){
System.out.println(\ System.out.println(\ System.exit(-1); } try{
timeSocket = new ServerSocket(Integer.parseInt(args[0]));
System.out.println(\时间服务器已经启动,正在侦听断口\ try{
while(true){
clientSocket = timeSocket.accept(); try{
out = clientSocket.getOutputStream(); currDate = new Date();
out.write(currDate.toString().getBytes());
System.out.println(\服务器时间[\已经发送到\ clientSocket.getInetAddress()); }finally {
clientSocket.close(); } } }finally {
timeSocket.close(); }
}catch(IOException ex){ System.out.println(ex);
}catch(NumberFormatException e){ System.out.println(\ } System.exit(0); } }
(2)客户端
DaytimeClient.java import java.net.*; import java.io.*;
public class DaytimeClient{
public static void main(String[] args){ String serverName; String serverPort=\ InetAddress serverAddress; String inBuffer; Socket daytimeSocket; BufferedReader socketIn; if(args.length<2){
System.out.println(
\
System.out.println(\ } else{ try{
serverName=args[0];
serverAddress=InetAddress.getByName(serverName); serverPort=args[1];
System.out.println(\正在连接时间服务器\ serverAddress.toString()+\ daytimeSocket = new Socket( serverAddress,Integer.parseInt(serverPort)); try{
daytimeSocket.setSoTimeout(5 * 1000); socketIn=new BufferedReader(
new InputStreamReader(daytimeSocket.getInputStream())); inBuffer = socketIn.readLine();
System.out.println(\时间服务器应答: \ }finally{
daytimeSocket.close(); }
}catch(IOException ex){ System.out.println(ex);
}catch(NumberFormatException e){
System.out.println(\ } }
System.exit(0); } }
运行结果: 服务器:
客户端:
2. 使用套接字传输数据,计算机三角形面积,客户端输入三角形的三条边长,并将
数据发送给服务器端,服务器端计算机三角形面积并发送给客户端 (1)客户端程序
Client.java
import java.net.*; import java.io.*; import java.awt.*;
import java.awt.event.*; import javax.swing.*;
class Client extends JFrame implements Runnable,ActionListener {
JButton connection,computer; JTextField inputA,inputB,inputC; JTextArea showResult; Socket socket=null;
DataInputStream in=null; DataOutputStream out=null; Thread thread; public Client() {
socket=new Socket(); connection=new JButton(\连接服务器\ computer=new JButton(\求三角形面积\ computer.setEnabled(false); inputA=new JTextField(\ inputB=new JTextField(\ inputC=new JTextField(\
Box boxV1=Box.createVerticalBox(); boxV1.add(new JLabel(\输入边A\ boxV1.add(new JLabel(\输入边B\ boxV1.add(new JLabel(\输入边C\ Box boxV2=Box.createVerticalBox(); boxV2.add(inputA); boxV2.add(inputB); boxV2.add(inputC);
Box baseBox=Box.createHorizontalBox(); baseBox.add(boxV1); baseBox.add(boxV2);
Container con=getContentPane(); con.setLayout(new FlowLayout()); showResult=new JTextArea(8,18); con.add(connection); con.add(baseBox); con.add(computer);
con.add(new JScrollPane(showResult)); computer.addActionListener(this);