图2 Socket通信客户端界面 2.图1为Socket通信服务器端界面,点击该界面中的【Start】按钮,启动服务器监听服务(在图1界面中间的多行文本区域显示“Server starting…”字样)。图2为Socket通信客户端界面,点击该界面中的【Connect】按钮与服务器建立链接,并在图2所示界面中间的多行文本区域显示“Connect to server…”字样,当服务器端监听到客户端的连接后,在图1界面中间的多行文本区域追加一行“Client connected…”字样,并与客户端建立Socket连接。 3.当图1所示的服务器端和图2所示的客户机端建立Socket连接后,编程实现这两端的数据通信,每次将接收到对方的数据追加显示在多行文本框中。 三、思考题 1. 对整个实验进行总结,写出实验心得。 2. 在完成上述实验内容的基础上,尝试实现服务器端能够与多个客户机进行通信。 三、使用硬件、软件环境 PC 计算机一台,配置为CPU为1.5G,内存为512M,硬盘为40G,安装WindowsXP操作系统。 另外,使用JCreator,JDK1.6.0等软件 四、实验过程、步骤及原始记录(算法、原程序、测试结果,分析等) ①分别编写两个文件Client.java Server.java;这两个代码的结构十分相似,都是先写一个主类,再写另一个实现类,主类通过创建实现类的对象来调用其构造方法来实现功能。实现类中写了很多方法,也写了很多内部类,方法层层调用。实现类在构造方法中写了调用了实现GUI的函数,也为按钮注册了监听器。在不同的内部类中写了不同监听器所调用的actioPerformed()方法。 ②在服务器中创建ServerSocket对象来接受客户端的连接请求,并指定端口号,客户端通过Socket对象来向服务器的ip和端口发送连接请求。服务器在接到连接请求后,服务器会创建一个新的Socket对象与客户端的Socket对象连接。连接成功后通过IO流来通信,服务器的输入流是客户端的输出流,服务器的输出流时客户端的输入流。 服务器代码如下: import java.awt.*; import java.awt.event.*; import java.util.*; import java.io.*; import java.net.*; import javax.swing.*; public class Server{ public static void main(String[] args){ MyFrame serve = new MyFrame(); serve.setVisible(true); serve.setResizable(false); //设置此窗体是否可由用户调整大小 } class MyFrame extends JFrame{ JTextField port; JButton start; JTextArea content; JTextField cin; JButton say; Socket socket; MyFrame(){ init(); StartListen sListen = new StartListen(); } serve.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置默认关闭操作 } SayListen stListen = new SayListen(); start.addActionListener(sListen); //为按钮start注册一个监听器 say.addActionListener(stListen); //为按钮say注册一个监听器 void init(){ setLayout(new FlowLayout()); //设置窗体为流式布局 } class StartListen implements ActionListener{ public void actionPerformed(ActionEvent e){ setSize(400,400); setLocation(400,100); add(new JLabel(\port = new JTextField(\add(port); start = new JButton(\add(start); content = new JTextArea(15,35); JScrollPane scroll = new JScrollPane(content); //设置滚动条 add(scroll); add(new JLabel(\cin = new JTextField(26); add(cin); say = new JButton(\add(say); start.setEnabled(false); ServerSocket s = new ServerSocket(Integer.parseInt(port.getText())); //创建 try { 一个服务器套接字对象s,形参为从port文本框中读取的整型(端口号) socket = s.accept(); PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//创建一个打印输出流对象,其形参为从套接字socket对象中获取的输出流 ServerThread st = new ServerThread(); //创建一个ServerThread对象 out.println(\ content.append(\ //对两个字符串进行拼接 st,并调用其构造方法 st.start(); //启动一个线程,并调用run()方法 } } catch (Exception ex) { } } class SayListen implements ActionListener{ String str; public void actionPerformed(ActionEvent e){ try {PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//创建一个打印输出流,形参为从套接字socket中获取的输出流 str=cin.getText(); if(!str.isEmpty()){ out.println(new Date()+\ //打印输出日期和发送的消息(str) } cin.setText(\content.append(new Date()+\out.flush(); //清空缓存区 } catch (Exception ex) {
相关推荐: