paste=new JMenuItem(\粘贴\ m2=new JMenu(\帮助\ content=new JMenuItem(\目录\ index=new JMenuItem(\索引\ about=new JMenuItem(\关于\ m1.add(open); // 将菜单项加入到菜单m1 中 m1.add(close); m1.addSeparator(); //在菜单中添加分隔条 m1.add(exit); mb.add(m1); // 将菜单m1 加入到菜单栏mb 中 m12.add(copy); m12.add(cut); m12.add(paste); m1.add(m12);//将m12 作为2 级菜单添加到m1 菜单项中 m2.add(content); m2.add(index); m2.addSeparator(); m2.add(about); mb.add(m2); setJMenuBar(mb); // 设置菜单栏为mb exit.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.exit(0); } }); about.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ JDialog dialog=new JDialog(MyFrame.this,true); dialog.setTitle(\关于\ dialog.setSize(200,80); dialog.add(new JLabel(\电子信息工程专业\ dialog.setVisible(true); } }); setVisible(true);//设置窗口是可视的 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
(3)编译MyFrame.java,产生类文件MyFrame.class。 (4)运行该程序 四、思考题
1.为该窗口添加弹出式菜单功能
实验四 socket网络编程实验
一、实验目的
1.掌握InetAddress类的使用。
2.掌握TCP与UDP编程:Socket与Datagram的概念和编程方法。 二、实验要求
1.通过Socket编程,掌握网络应用程序的开发方法。 2.掌握利用Socket进行TCP网络传输。
3.掌握利用DatagramSocket进行UDP网络传输。 三、实验内容
1. InetAddress类的方法
(1)程序功能:利用InetAddress类的方法实现域名解析和本地主机名和IP地址的获取。 (2)编写MyInetAddress.java程序文件,源代码如下: import java.net.*;
public class MyInetAddress { public static void main(String[] args) { try { InetAddress localAddress = InetAddress.getLocalHost(); InetAddress remoteAddress = InetAddress.getByName(\ System.out.println(\本机的IP地址:\ System.out.println(\本地的主机名为:\ System.out.println(\华夏学院的IP地址:\ System.out.println(\华夏学院的主机名为:\ } catch(Exception e) { System.out.println(\解析失败\ } } }
(3)编译MyInetAddress.java,产生类文件MyInetAddress.class。 (4)运行该程序。 2.UDP通信
UDP把应用层所传递来的信息封装为一个个独立的数据报文,简称数据报,然后分别将这些数据报发送。UDP不保证每个数据报是否达到目的主机,因为有可能丢失,而且不保证数据报的到达时间和到达顺序。在Java网络API中与UDP数据报相关的类是DatagramPacket类和DatagramSocket类,前者用于创建一个发送或接收的数据报对象,后者是创建一个可用来发送或接收数据报的Socket对象。
(1)程序功能:利用UDP协议设计接收端与发送端程序。 (2)编写UDPSend.java程序文件,源代码如下:
import java.net.*; public class UDPSend { public static void main(String[] args) { try { // 创建一个DatagramSocket对象 DatagramSocket ds = new DatagramSocket(3000); String str = \要发送的数据 /* * 创建一个要发送的数据包,数据包包括发送的数据,数据的长度,接收端的IP地址以及端口号 */ DatagramPacket dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName(\ System.out.println(\发送信息\ ds.send(dp); // 发送数据 ds.close(); // 释放资源 } catch(Exception e) { System.out.println(\发送异常\ } } }
(3)编写UDPReceive.java程序文件,源代码如下: import java.net.*;
public class UDPReceive { public static void main(String[] args) { try { byte[] buf = new byte[1024]; // 创建一个长度为1024的字节数组,用于接收 // 定义一个DatagramSocket对象,监听的端口号为8954 DatagramSocket ds = new DatagramSocket(8954); // 定义一个DatagramPacket对象,用于接收数据 DatagramPacket dp = new DatagramPacket(buf, 1024); System.out.println(\等待接收数据\ ds.receive(dp); // 等待接收数据,如果没有数据则会阻塞 // 调用DatagramPacket的方法获得接收到的信息,包括数据的内容、长度、发送的IP地址和端口号
String str = new String(dp.getData(), 0, dp.getLength()) + \ + dp.getAddress().getHostAddress() + \ System.out.println(str); // 打印接收到的信息 ds.close();// 释放资源 } catch(Exception e) { System.out.println(\接收异常\ } } }
(4)编译UDPReceive.java和UDPSend.java,分别产生类文件UDPReceive.class和UDPSend.class。 (5)运行该程序。 3.TCP通信
从编程的角度,仅需要调用Socket所提供的接口就可以完成实际的网络通信,Socket代表了TCP双向通信连接的一个端点,是对TCP网络连接的一种抽象。首先,通信双方需要建立Socket连接,之后双方都有各自的Socket对象,该Socket对象包含有两个流,一个是输入流,表示流入的数据流,其作用是接收数据。另一个是输出流,表示流出的数据,其作用是向外发送数据。
(1)程序功能:利用TCP协议设计客户端与服务器程序。 (2)编写TCPClient.java程序文件,源代码如下: import java.io.*; import java.net.*;
public class TCPClient { public static void main(String[] args) { try { //创建一个Socket并连接到给出地址和端口号的计算机 Socket client = new Socket(InetAddress.getLocalHost(), 7788); OutputStream os = client.getOutputStream();// 获取客户端的输出流 System.out.println(\开始与服务端交互数据\ os.write((\电子信息工程专业\ // 当客户端连接到服务端时,向客户端输出数据 Thread.sleep(5000); // 模拟执行其它功能占用的时间 System.out.println(\结束与服务端交互数据\ os.close(); client.close(); // 关闭Socket对象,释放资源 } catch(Exception e) { System.out.println(\客户端异常\
} } }
(3)编写TCPServer.java程序文件,源代码如下: import java.io.*; import java.net.*;
public class TCPServer { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(7788); // 创建ServerSocket对象 Socket client = serverSocket.accept(); // 调用ServerSocket的accept()方法接收数据 InputStream is = client.getInputStream(); // 得到接收数据的流 byte[] buf = new byte[1024]; // 定义1024个字节数组的缓冲区 int len = is.read(buf); // 将数据读到缓冲区中 System.out.println(new String(buf, 0, len)); // 将缓冲区中的数据输出 is.close(); client.close(); } catch(Exception e) { System.out.println(\服务端异常\ } } }
(4)编译TCPClient.java和TCPServer.java,分别产生类文件TCPClient.class和TCPServer.class。 (5)运行该程序。
四、思考题
1.网络环境下的C/S模式的基本思想是什么?什么是客户机?什么是服务器?它们各自的作用如何?C/S模式的基本工作过程如何?
2.简述流式Socket的通信机制。它的最大特点是什么?
3.数据报通信有何特点?简述Java实现数据报通信的基本工作过程。