<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
要實現TCP通訊需要建立一個伺服器端程式和一個使用者端程式,為了保證資料傳輸的安全性,首先需要實現伺服器端程式,然後在編寫使用者端程式。
在本機執行伺服器端程式,在遠端機執行使用者端程式
本機的IP地址:192.168.129.222
遠端機的IP地址:192.168.214.213
在net.hw.network包裡建立Server類
package net.hw.network; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * 功能:伺服器端 * 作者:華衛 * 日期:2022年03月18日 */ public class Server extends JFrame { static final int PORT = 8136; static final String HOST_IP = "192.168.129.222"; private JPanel panel1, panel2; private JTextArea txtContent, txtInput, txtInputIP; private JScrollPane panContent, panInput; private JButton btnClose, btnSend; private ServerSocket serverSocket; private Socket socket; private DataInputStream netIn; private DataOutputStream netOut; public static void main(String[] args) { new Server(); } public Server() { super("伺服器"); //建立元件 panel1 = new JPanel(); panel2 = new JPanel(); txtContent = new JTextArea(15, 60); txtInput = new JTextArea(3, 60); panContent = new JScrollPane(txtContent, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); panInput = new JScrollPane(txtInput, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); btnClose = new JButton("關閉"); btnSend = new JButton("傳送"); //新增元件 getContentPane().add(panContent, "Center"); getContentPane().add(panel1, "South"); panel1.setLayout(new GridLayout(0, 1)); panel1.add(panInput); panel1.add(panel2); panel2.add(btnSend); panel2.add(btnClose); //設定元件屬性 txtContent.setEditable(false); txtContent.setFont(new Font("宋體", Font.PLAIN, 13)); txtInput.setFont(new Font("宋體", Font.PLAIN, 15)); txtContent.setLineWrap(true); txtInput.setLineWrap(true); txtInput.requestFocus(); setSize(450, 350); setLocation(50, 200); setResizable(false); setVisible(true); //等候客戶請求 try { txtContent.append("伺服器已啟動...n"); serverSocket = new ServerSocket(PORT); txtContent.append("等待客戶請求...n"); socket = serverSocket.accept(); txtContent.append("連線一個客戶。n" + socket + "n"); netIn = new DataInputStream(socket.getInputStream()); netOut = new DataOutputStream(socket.getOutputStream()); } catch (IOException e1) { e1.printStackTrace(); } / //註冊監聽器,編寫事件程式碼 txtContent.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { displayClientMsg(); } }); txtInput.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { displayClientMsg(); } }); panel2.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { displayClientMsg(); } }); txtInput.addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent e) { displayClientMsg(); } }); txtInput.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { displayClientMsg(); } }); btnSend.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { String serverMsg = txtInput.getText(); if (!serverMsg.trim().equals("")) { txtContent.append("伺服器>" + serverMsg + "n"); netOut.writeUTF(serverMsg); } else { JOptionPane.showMessageDialog(null, "不能傳送空資訊!", "伺服器", JOptionPane.WARNING_MESSAGE); } txtInput.setText(""); txtInput.requestFocus(); } catch (IOException ie) { ie.printStackTrace(); } } }); btnClose.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { try { netIn.close(); netOut.close(); socket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } System.exit(0); } }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { try { netIn.close(); netOut.close(); socket.close(); serverSocket.close(); } catch (IOException ie) { ie.printStackTrace(); } System.exit(0); } public void windowActivated(WindowEvent e) { txtInput.requestFocus(); } }); } //顯示使用者端資訊 void displayClientMsg() { try { if (netIn.available() > 0) { String clientMsg = netIn.readUTF(); txtContent.append("使用者端>" + clientMsg + "n"); } } catch (IOException e1) { e1.printStackTrace(); } } }
在net.hw.network包裡建立Client類
package net.hw.network; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; /** * 功能:使用者端 * 作者:華衛 * 日期:2022年03月18日 */ public class Client extends JFrame { private JPanel panel1, panel2; private JTextArea txtContent, txtInput; private JScrollPane panContent, panInput; private JButton btnClose, btnSend; private Socket socket; private DataInputStream netIn; private DataOutputStream netOut; public static void main(String[] args) { new Client(); } public Client() { super("使用者端"); //建立元件 panel1 = new JPanel(); panel2 = new JPanel(); txtContent = new JTextArea(15, 60); txtInput = new JTextArea(3, 60); panContent = new JScrollPane(txtContent, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); panInput = new JScrollPane(txtInput, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); btnClose = new JButton("關閉"); btnSend = new JButton("傳送"); //新增元件 getContentPane().add(panContent, "Center"); getContentPane().add(panel1, "South"); panel1.setLayout(new GridLayout(0, 1)); panel1.add(panInput); panel1.add(panel2); panel2.add(btnSend); panel2.add(btnClose); //設定元件屬性 txtContent.setEditable(false); txtContent.setFont(new Font("宋體", Font.PLAIN, 13)); txtInput.setFont(new Font("宋體", Font.PLAIN, 15)); txtContent.setLineWrap(true); txtInput.setLineWrap(true); txtInput.requestFocus(); setSize(450, 350); setLocation(550, 200); setResizable(false); setVisible(true); //連線伺服器 try { txtContent.append("連線伺服器...n"); socket = new Socket(Server.HOST_IP, Server.PORT); txtContent.append("連線伺服器成功。n" + socket + "n"); netIn = new DataInputStream(socket.getInputStream()); netOut = new DataOutputStream(socket.getOutputStream()); } catch (IOException e1) { JOptionPane.showMessageDialog(null, "伺服器連線失敗!n請先啟動伺服器程式!", "使用者端", JOptionPane.ERROR_MESSAGE); System.exit(1); } / //註冊監聽器,編寫事件程式碼 txtContent.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { displayServerMsg(); } }); txtInput.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { displayServerMsg(); } }); panel2.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { displayServerMsg(); } }); txtInput.addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent e) { displayServerMsg(); } }); txtInput.addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { displayServerMsg(); } }); btnSend.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { String clientMsg = txtInput.getText(); if (!clientMsg.trim().equals("")) { netOut.writeUTF(clientMsg); txtContent.append("使用者端>" + clientMsg + "n"); } else { JOptionPane.showMessageDialog(null, "不能傳送空資訊!", "使用者端", JOptionPane.WARNING_MESSAGE); } txtInput.setText(""); txtInput.requestFocus(); } catch (IOException ie) { ie.printStackTrace(); } } }); btnClose.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { netIn.close(); netOut.close(); socket.close(); } catch (IOException ie) { ie.printStackTrace(); } System.exit(0); } }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { try { netIn.close(); netOut.close(); socket.close(); } catch (IOException ie) { ie.printStackTrace(); } System.exit(0); } public void windowActivated(WindowEvent e) { txtInput.requestFocus(); } }); } //顯示伺服器端資訊 void displayServerMsg() { try { if (netIn.available() > 0) { String serverMsg = netIn.readUTF(); txtContent.append("伺服器>" + serverMsg + "n"); } } catch (IOException e1) { e1.printStackTrace(); } } }
在本機[192.168.129.222]上啟動伺服器端
在遠端機[192.168.214.213]上啟動使用者端
顯示連線伺服器[192.168.129.222]成功,切換到伺服器端檢視,顯示連線了一個客戶[192.168.214.213]
此時,伺服器端和使用者端就可以相互通訊了
其實,很多伺服器端程式都是允許被多個應用程式存取的,例如入口網站可以被多個使用者同時存取,因此伺服器端都是多執行緒的。
以上就是Java實戰之基於TCP實現簡單聊天程式的詳細內容,更多關於Java TCP聊天程式的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45