合工大Java实验报告(6)
} str = in.readLine(); //按行读取 content.append( str+\); } } catch (Exception ex) {} } } 客户端代码: import java.awt.*; import java.awt.event.*; import java.util.*; import java.io.*; import java.net.*; import javax.swing.*; import java.util.Calendar; public class Client{ public static void main(String[] args) { MyFrame client=new MyFrame(); client.setTitle(\客户端\); client.setVisible(true); client.setResizable(false); //设置此窗体是否可由用户调整大小 client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭操作 } } class MyFrame extends JFrame { JTextField ip; JTextField port; JTextField cin; JTextArea content; JButton connect; JButton say; Socket socket; MyFrame(){ init(); ConnectListen cListener=new ConnectListen(); SayListen sListener = new SayListen(); connect.addActionListener(cListener); //注册监听器 say.addActionListener(sListener); //注册监听器 } void init(){
setLayout(new FlowLayout()); //设置窗体为流式布局 setSize(440,500); setLocation(800,100); add(new JLabel(\)); ip=new JTextField(\,8); add(ip); add(new JLabel(\)); port=new JTextField(\,8); add(port); connect=new JButton(\); add(connect); content=new JTextArea(16,35); JScrollPane scroll=new JScrollPane(content); //设置滚动条 add(scroll); add(new Label(\)); cin=new JTextField(\你好!\,25); add(cin); say=new JButton(\); add(say); } class ConnectListen implements ActionListener{ int portNum; public void actionPerformed(ActionEvent e){ connect.setEnabled(false); //按下 connect 按钮后, connect 不可再次点击 try { content.setText(\); //在文本区中显示 \ portNum =Integer.parseInt(port.getText()); //读取 port 文本框中的字符串,并将字符串转化为整型赋给 portNum socket = new Socket(ip.getText(),portNum); //定义对象 socket,并指定主机号(host)和端口号 portNum ClientThread ct = new ClientThread(); //定义一个 ClientThread 类的对象 ct ct.start(); //启动一个线程,并调用ClientThread 类中的 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 获取字节输出流,并将其最终转化为 PrintWriter str=cin.getText(); //从文本框中获取字符串赋给 str if(!str.isEmpty()){ out.println(new Date()+ \+ str); //打印日期和 str content.append(new Date()+\+str+\); out.flush(); //清空缓存区 } cin.setText(\); } catch (Exception ex) {} } } class ClientThread extends Thread{ public void run(){ try { BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //创建一个缓冲输出流,其形参为从套接字 socket 中获取的输入流 String str; while(true){ str = in.readLine(); //按行读取 content.append( str+\); } } catch (Exception ex) {} } } } 运行结果:
五、实验结论、分析、思考题与心得体会 通过本次实验,我对于GUI程序的便编写,以及网络通信与多线程编程有了一定的了解,并且也亲自实现了一个基于GUI的客户-服务器的通信应用程序,在实验过程中,我也遇到了不少的问题并加以解决: 1.因为服务器的GUI界面有start和say按钮,客户端有connect和say按钮,按钮被点击后会触发动作事件。而不同的按钮要执行不同的操作,也就意味着要写多个actionPerformed()方法,可是一个类里面只能写一个actionPerformed()方法,因此可以写几个实现了ActionPerformed()方法,在内部类中再写一个actionPerformed()方法,这样就写了好几个不同的actionPerformed()方法,在注册监听器的时候,按钮需要实现哪种功能,就用哪个内部类的对象来监听就可以了。 2.在服务器中创建 ServerSocket 对象来接受客户端的连接请求, 并指定端口号, 客户端通过Socket 对象来向服务器的 ip 和端口发送连接请求。服务器在接到连接请求后,服务器会创建一个新的 Socket 对象与客户端的 Socket 对象连接。连接成功后通过 IO 流来通信,服务器的输入流是客户端的输出流,服务器的输出流时客户端的输入流
…… 此处隐藏:1200字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [政务民生]2013年公共基础知识热点问题(七)
- [政务民生]检验检测机构资质认定评审准则及释义20
- [政务民生]关于印发重庆市房屋建筑和市政基础设施
- [政务民生]1、隧道洞身开挖支护施工技术交底书
- [政务民生]2015年山东省17地市中考语文试题分类汇
- [政务民生]2-高级会计师资格考试和评审流程图
- [政务民生]2018版中国清分机行业发展分析及前景策
- [政务民生]新课改高中政治探究
- [政务民生]2018-2024年中国新型组合房屋行业投资
- [政务民生]2015年上海市春季高考数学模拟试卷五
- [政务民生]灌砂法及环刀法测压实度(带计算过程)
- [政务民生]运筹学实验2求解非线性规划
- [政务民生]劝学、逍遥游默写(教师卷)
- [政务民生]《运筹学》 - 期末考试 - 试卷A - 答案
- [政务民生]八年级英语下册 Module 6 Hobbies测试
- [政务民生]2019年宪法知识竞赛试题库100题(含答
- [政务民生]自动化英文文献翻译
- [政务民生]公文格式实施细则
- [政务民生]高一地理上册课堂跟踪练习题6
- [政务民生]会计继续教育习题及答案
- 第三章 无约束最优化方法
- 泛读教程第三册答案
- 魏晋南北朝文学
- 幂的运算复习题
- 城市环境问题的成因与治理策略_以社会
- 钢结构行业产业链及竞争分析研究
- 新型热塑性弹性体增韧聚丙烯的研究
- 中国旅游地理B卷试题及答案
- (苏教版)五年级数学上册第三单元测试卷
- 不稳定性心绞痛诊断与治疗
- 俞氏国际后勤职能部门绩效考核办法
- GB7258-2017新标准考试题含答案
- 小学生汉字听写比赛活动方案
- 1.3《平抛运动》学案 教科版必修2
- 2011香港特别行政区公务员考试复习资料
- 考虑水力条件变化的城市给水管网可靠性
- 表面活性剂在油田开发和生产中的应用
- ITT内部培训资料-FI端吸泵的介绍
- 文明守纪,从我做起学生发言稿
- 初中读《聊斋志异》心得体会800字范文




