Java聊天室之實(shí)現(xiàn)接收和發(fā)送Socket
一、題目描述
題目實(shí)現(xiàn):網(wǎng)絡(luò)通信,實(shí)現(xiàn)信息的發(fā)送和接收。
二、解題思路
創(chuàng)建一個(gè)服務(wù)器類:ServerSocketFrame,繼承JFrame類
寫一個(gè)getserver() 方法,實(shí)例化Socket對(duì)象,啟用9527當(dāng)服務(wù)的端口。
創(chuàng)建輸入流對(duì)象,用來接收客戶端信息。
再定義一個(gè)getClientInfo()方法,用于接收客戶端發(fā)送的信息。
創(chuàng)建一個(gè)客戶端類:ClientSocketFrame,繼承JFrame類。
寫一個(gè)connect() 方法,實(shí)例化Socket對(duì)象,連接本地服務(wù)的9527端口服務(wù)。
技術(shù)重點(diǎn):
通過Socket類的getInpuStream()方法來獲得輸入流對(duì)象,使用getOutputStream()方法獲得輸出流對(duì)象實(shí)現(xiàn)。
三、代碼詳解
ServerSocketFrame
package com.xiaoxuzhu; import java.awt.BorderLayout; import java.io.*; import java.net.*; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; /** * Description: * * @author xiaoxuzhu * @version 1.0 * * <pre> * 修改記錄: * 修改后版本 修改人 修改日期 修改內(nèi)容 * 2022/6/4.1 xiaoxuzhu 2022/6/4 Create * </pre> * @date 2022/6/4 */ public class ServerSocketFrame extends JFrame { private JTextArea ta_info;// 聲明文本域,用于顯示連接信息和接收到的信息 private BufferedReader reader; // 聲明BufferedReader對(duì)象 private ServerSocket server; // 聲明ServerSocket對(duì)象 private Socket socket; // 聲明Socket對(duì)象socket public void getServer() { try { server = new ServerSocket(9527); // 實(shí)例化Socket對(duì)象 ta_info.append("服務(wù)器套接字已經(jīng)創(chuàng)建成功\n"); // 輸出信息 while (true) { // 如果套接字是連接狀態(tài) ta_info.append("等待客戶機(jī)的連接......\n"); // 輸出信息 socket = server.accept(); // 實(shí)例化Socket對(duì)象 ta_info.append("連接成功。\n"); // 輸出信息 reader = new BufferedReader(new InputStreamReader(socket .getInputStream())); // 實(shí)例化BufferedReader對(duì)象 getClientInfo(); // 調(diào)用getClientInfo()方法 } } catch (Exception e) { e.printStackTrace(); // 輸出異常信息 } } private void getClientInfo() { try { while (true) { // 如果套接字是連接狀態(tài) ta_info.append("接收到客戶機(jī)發(fā)送的信息:" + reader.readLine() + "\n"); // 獲得客戶端信息 } } catch (Exception e) { ta_info.append("客戶端已退出。\n"); // 輸出異常信息 } finally { try { if (reader != null) { reader.close();// 關(guān)閉流 } if (socket != null) { socket.close(); // 關(guān)閉套接字 } } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { // 主方法 ServerSocketFrame frame = new ServerSocketFrame(); // 創(chuàng)建本類對(duì)象 frame.setVisible(true); frame.getServer(); // 調(diào)用方法 } public ServerSocketFrame() { super(); setTitle("服務(wù)器端程序"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 336, 257); final JScrollPane scrollPane = new JScrollPane(); getContentPane().add(scrollPane, BorderLayout.CENTER); ta_info = new JTextArea(); scrollPane.setViewportView(ta_info); } }
ClientSocketFrame
package com.xiaoxuzhu; import java.awt.*; import java.awt.BorderLayout; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swing.*; import javax.swing.JScrollPane; /** * Description: * * @author xiaoxuzhu * @version 1.0 * * <pre> * 修改記錄: * 修改后版本 修改人 修改日期 修改內(nèi)容 * 2022/6/4.1 xiaoxuzhu 2022/6/4 Create * </pre> * @date 2022/6/4 */ public class ClientSocketFrame extends JFrame { // 創(chuàng)建類繼承JFrame類 private PrintWriter writer; // 聲明PrintWriter類對(duì)象 private Socket socket; // 聲明Socket對(duì)象 private JTextArea ta_info = new JTextArea(); // 創(chuàng)建JtextArea對(duì)象 private JTextField tf_send = new JTextField(); // 創(chuàng)建JtextField對(duì)象 private Container cc; // 聲明Container對(duì)象 public ClientSocketFrame() { // 構(gòu)造方法 super(); // 調(diào)用父類的構(gòu)造方法 setTitle("客戶端程序"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 351, 257); cc = this.getContentPane(); // 實(shí)例化對(duì)象 cc.add(tf_send, "South"); // 將文本框放在窗體的下部 tf_send.addActionListener(new ActionListener() { // 綁定事件 public void actionPerformed(ActionEvent e) { writer.println(tf_send.getText()); // 將文本框中信息寫入流 ta_info.append("客戶端發(fā)送的信息是:" + tf_send.getText() + "\n"); // 將文本框中信息顯示在文本域中 tf_send.setText(""); // 將文本框清空 } }); final JScrollPane scrollPane = new JScrollPane(); getContentPane().add(scrollPane, BorderLayout.CENTER); scrollPane.setViewportView(ta_info); } private void connect() { // 連接套接字方法 ta_info.append("嘗試連接......\n"); // 文本域中信息信息 try { // 捕捉異常 socket = new Socket("127.0.0.1", 9527); // 實(shí)例化Socket對(duì)象 writer = new PrintWriter(socket.getOutputStream(), true);// 創(chuàng)建輸出流對(duì)象 ta_info.append("完成連接。\n"); // 文本域中提示信息 } catch (Exception e) { e.printStackTrace(); // 輸出異常信息 } } public static void main(String[] args) { // 主方法 ClientSocketFrame clien = new ClientSocketFrame(); // 創(chuàng)建本例對(duì)象 clien.setVisible(true); // 將窗體顯示 clien.connect(); // 調(diào)用連接方法 } }
服務(wù)端啟動(dòng)
客戶端啟動(dòng)
客戶端發(fā)送信息
服務(wù)端接收信息
以上就是Java聊天室之實(shí)現(xiàn)接收和發(fā)送Socket的詳細(xì)內(nèi)容,更多關(guān)于Java聊天室的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IDEA-SpringBoot項(xiàng)目Debug啟動(dòng)不了(卡住不動(dòng))的原因分析
這篇文章主要介紹了IDEA-SpringBoot項(xiàng)目Debug啟動(dòng)不了(卡住不動(dòng))的原因分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Java實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)易學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07Spring整合Mybatis使用<context:property-placeholder>時(shí)的坑
這篇文章主要介紹了Spring整合Mybatis使用<context:property-placeholder>時(shí)的坑 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06