第四次作业

作业要求

将《TCP/IP网络编程》第1章的Hello客户服务器程序改成GUI小程序,并实现以下功能:
  1. 服务器程序 可以同时接收最多5个客户的访问。
  2. 实现迭代回声服务器功能,可以循环接收客户消息,并以特定消息(如“Quit”)结束服务。
  3. 考虑实现简单智能回复功能,即服务器根据客户的消息进行回答,或随机回复客户消息。

步骤

一、选择通信方式并实现

选择TCP实现在服务器端跟客户端通信,首先在TCP服务器端定义一个端口号,并创建ServerSocket对象,调用ServerSocket的accept()方法接收数据,并且等待客户端的连接服务器。

private static final int PORT = 7788;
private ServerSocket serverSocket;
this.serverSocket = new ServerSocket(PORT);
Socket socket = serverSocket.accept();

在客户端定义一个跟服务器相同的端口号,并创建一个Socket连接到给出IP地址跟端口号的服务器端。

private static final int PORT = 7788;
private String hostIP = "127.0.0.1";  //本机IP地址
private Socket socket;
socket = new Socket(hostIP, PORT);

接下来实现服务器跟客户机之间发送消息的机制,

BufferedReader br = getReader(socket);

private BufferedReader getReader(Socket socket)throws IOException{
    InputStream in = socket.getInputStream();
    return new BufferedReader(new InputStreamReader(in,"UTF-8"));
}

使用Socket的getInputStream()方法,返回一个InputStream类型的输出流对象,如果该对象有服务器端的Socket返回,就用于读取客户端发送的数据,反之用于读取服务器端发送的数据,并且使用BufferedReader包装将字节流转换成字符流的InputStreamReader。

bw.write(reply); //回显
bw.newLine();
bw.flush();

write()方法发送数据给客户端,newline()相当于插入一个行分割符,判断一行字符串是否结束,flush()方法刷新缓冲区
  发送数据的方法跟读取数据的方法差不多,使用getOutputStream()获得OutputStream类型的输出流对象,如果是该对象是服务器端的Socket返回,就用于向客户端发送数据,反之用于向服务器端发送数据,并且使用BufferedWriter包装字符流转换成字节流的OutputStreamWriter

BufferedWriter bw = null;

bw = getWriter(socket);

private BufferedWriter getWriter(Socket socket)throws IOException{
        OutputStream out = socket.getOutputStream();
        return new BufferedWriter(new OutputStreamWriter(out,"UTF-8"));
}
二、智能回复

找到一个网络接口,会根据相应的输入智能输出信息,网址:"http://api.qingyunke.com/api.php?key=free&appid=0&msg="+str。

三、实现图形化界面

首先给程序添加组件,下面以添加JTextArea为例,创建一个JTextArea对象跟JScrollPane对象,把JTextArea对象添加到JScrollPane对象中,再把JScrollPane对象添加到JFrame面板上,把输入的消息通过getText()获取到,并通过append()方法添加到JTextArea文本域中。

JScrollPane scrollPane = null;
JTextArea showContent = null;

showContent = new JTextArea();
showContent.setFont(new Font("仿宋",Font.BOLD,20));
scrollPane = new JScrollPane(showContent);

this.add(scrollPane, BorderLayout.CENTER);

String str = inputField.getText();  
showContent.append(showTime()+" 客户端"+":"+str+"\r\n");

采用边界布局管理器布局面板,把创建GUI面板需要用到组件相应的添加到面板中

实验GIF截图
Servers.gif

实验结论与感想

本实验需要首先启动服务器即net Server.java程序,但是不会有任何的输出,但是启动就一直在客户端的连接,即等待NetClient.java的运行。作业能够完成迭代回声服务器的相应功能,即服务器依次回复客户端发送的消息,\客户输入“Quit”结束当前服务开始服务下一个客户,最多回复5个客户端即停止提供服务。
  实验仍然有很大的改进空间,比如当第一次提供五个客户端服务完成之后,继续等待下次客户端的连接而不是关闭端口,这样做会造成下次连接需要再次打开服务器。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,172评论 6 13
  • 冯过 软件工程二班 1505060204 作业目的:用套接字编程写一个GUI小程序实现简单的只能回复功能。 实现过...
    ggala阅读 235评论 0 0
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,944评论 0 15
  • 饭快做好了,儿子去楼下骑平衡车也回来了,进屋把平衡车随便一放,自己就摊坐在地上一副若有所思的样子——应该是累...
    飞蛾娥阅读 383评论 0 1