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