作業(yè)要求
將《TCP/IP網(wǎng)絡(luò)編程》第1章的Hello客戶服務(wù)器程序改成GUI小程序妥粟,并實現(xiàn)以下功能:
??1. 服務(wù)器程序 可以同時接收最多5個客戶的訪問炊甲。
??2. 實現(xiàn)迭代回聲服務(wù)器功能贷掖,可以循環(huán)接收客戶消息刑赶,并以特定消息(如“Quit”)結(jié)束服務(wù)锯厢。
??3. 考慮實現(xiàn)簡單智能回復(fù)功能谆膳,即服務(wù)器根據(jù)客戶的消息進行回答叭爱,或隨機回復(fù)客戶消息。
步驟
一漱病、選擇通信方式并實現(xiàn)
選擇TCP實現(xiàn)在服務(wù)器端跟客戶端通信买雾,首先在TCP服務(wù)器端定義一個端口號,并創(chuàng)建ServerSocket對象杨帽,調(diào)用ServerSocket的accept()方法接收數(shù)據(jù)凝果,并且等待客戶端的連接服務(wù)器。
private static final int PORT = 7788;
private ServerSocket serverSocket;
this.serverSocket = new ServerSocket(PORT);
Socket socket = serverSocket.accept();
在客戶端定義一個跟服務(wù)器相同的端口號睦尽,并創(chuàng)建一個Socket連接到給出IP地址跟端口號的服務(wù)器端器净。
private static final int PORT = 7788;
private String hostIP = "127.0.0.1"; //本機IP地址
private Socket socket;
socket = new Socket(hostIP, PORT);
接下來實現(xiàn)服務(wù)器跟客戶機之間發(fā)送消息的機制,
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類型的輸出流對象山害,如果該對象有服務(wù)器端的Socket返回,就用于讀取客戶端發(fā)送的數(shù)據(jù)沿量,反之用于讀取服務(wù)器端發(fā)送的數(shù)據(jù)浪慌,并且使用BufferedReader包裝將字節(jié)流轉(zhuǎn)換成字符流的InputStreamReader。
bw.write(reply); //回顯
bw.newLine();
bw.flush();
write()方法發(fā)送數(shù)據(jù)給客戶端朴则,newline()相當(dāng)于插入一個行分割符权纤,判斷一行字符串是否結(jié)束,flush()方法刷新緩沖區(qū)
??發(fā)送數(shù)據(jù)的方法跟讀取數(shù)據(jù)的方法差不多,使用getOutputStream()獲得OutputStream類型的輸出流對象汹想,如果是該對象是服務(wù)器端的Socket返回外邓,就用于向客戶端發(fā)送數(shù)據(jù),反之用于向服務(wù)器端發(fā)送數(shù)據(jù)古掏,并且使用BufferedWriter包裝字符流轉(zhuǎn)換成字節(jié)流的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"));
}
二损话、智能回復(fù)
找到一個網(wǎng)絡(luò)接口,會根據(jù)相應(yīng)的輸入智能輸出信息槽唾,網(wǎng)址:"http://api.qingyunke.com/api.php?key=free&appid=0&msg="+str丧枪。
三、實現(xiàn)圖形化界面
首先給程序添加組件庞萍,下面以添加JTextArea為例拧烦,創(chuàng)建一個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");
采用邊界布局管理器布局面板,把創(chuàng)建GUI面板需要用到組件相應(yīng)的添加到面板中
實驗GIF截圖
實驗結(jié)論與感想
本實驗需要首先啟動服務(wù)器即net Server.java程序重虑,但是不會有任何的輸出践付,但是啟動就一直在客戶端的連接,即等待NetClient.java的運行缺厉。作業(yè)能夠完成迭代回聲服務(wù)器的相應(yīng)功能永高,即服務(wù)器依次回復(fù)客戶端發(fā)送的消息,\客戶輸入“Quit”結(jié)束當(dāng)前服務(wù)開始服務(wù)下一個客戶提针,最多回復(fù)5個客戶端即停止提供服務(wù)命爬。
??實驗仍然有很大的改進空間,比如當(dāng)?shù)谝淮翁峁┪鍌€客戶端服務(wù)完成之后辐脖,繼續(xù)等待下次客戶端的連接而不是關(guān)閉端口饲宛,這樣做會造成下次連接需要再次打開服務(wù)器。