亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java實戰(zhàn)之基于TCP實現簡單聊天程序

 更新時間:2022年03月19日 08:47:04   作者:howard2005  
這篇文章主要為大家詳細介紹了如何在Java中基于TCP實現簡單聊天程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、如何實現TCP通信

要實現TCP通信需要創(chuàng)建一個服務器端程序和一個客戶端程序,為了保證數據傳輸的安全性,首先需要實現服務器端程序,然后在編寫客戶端程序。

在本機運行服務器端程序,在遠程機運行客戶端程序

本機的IP地址:192.168.129.222

遠程機的IP地址:192.168.214.213

二、編寫C/S架構聊天程序

1.編寫服務器端程序 - Server.java

在net.hw.network包里創(chuàng)建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;

/**
 * 功能:服務器端
 * 作者:華衛(wèi)
 * 日期: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("服務器");

        //創(chuàng)建組件
        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("發(fā)送");

        //添加組件
        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();
        }

        /

        //注冊監(jiān)聽器,編寫事件代碼	
        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, "不能發(fā)送空信息!", "服務器", 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();
        }
    }
}

2.編寫客戶端程序 - Client.java

在net.hw.network包里創(chuàng)建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;

/**
 * 功能:客戶端
 * 作者:華衛(wèi)
 * 日期: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("客戶端");

        //創(chuàng)建組件
        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("發(fā)送");

        //添加組件
        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);
        }

        /

        //注冊監(jiān)聽器,編寫事件代碼
        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, "不能發(fā)送空信息!", "客戶端", 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();
        }
    }
}

3.測試服務器端與客戶端能否通信

在本機[192.168.129.222]上啟動服務器端

在遠程機[192.168.214.213]上啟動客戶端

顯示連接服務器[192.168.129.222]成功,切換到服務器端查看,顯示連接了一個客戶[192.168.214.213]

此時,服務器端和客戶端就可以相互通信了

4.程序優(yōu)化思路 - 服務器端采用多線程

其實,很多服務器端程序都是允許被多個應用程序訪問的,例如門戶網站可以被多個用戶同時訪問,因此服務器端都是多線程的。

以上就是Java實戰(zhàn)之基于TCP實現簡單聊天程序的詳細內容,更多關于Java TCP聊天程序的資料請關注腳本之家其它相關文章!

相關文章

  • Java中Set&List的迭代器實現步驟解析

    Java中Set&List的迭代器實現步驟解析

    這篇文章主要介紹了Java中Set&List的迭代器實現步驟解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Java并發(fā)之Semaphore工具類r的全面解析

    Java并發(fā)之Semaphore工具類r的全面解析

    Semaphore 是 java.util.concurrent中非常有用的并發(fā)編程工具類,它通常被用于限制對某個資源或資源池的并發(fā)訪問數量,下面我們就來深入了解一下Semaphore的具體使用吧
    2024-02-02
  • java中map與實體類的相互轉換操作

    java中map與實體類的相互轉換操作

    這篇文章主要介紹了java中map與實體類的相互轉換操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java中線程中斷的實現示例

    java中線程中斷的實現示例

    中斷只是一種協作協商機制,Java沒有給中斷增加任何語法,中斷的過程完全需要程序員自己實現,本文就來介紹一下線程中斷的實現,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 騰訊開源消息中間件TubeMQ總體介紹分析

    騰訊開源消息中間件TubeMQ總體介紹分析

    這篇文章主要為大家介紹了騰訊開源消息中間件TubeMQ的總體介紹分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • SpringBoot上傳圖片到指定位置并返回URL的實現

    SpringBoot上傳圖片到指定位置并返回URL的實現

    本文主要介紹了SpringBoot上傳圖片到指定位置并返回URL,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>
    2022-03-03
  • Java策略模式的簡單應用實現方法

    Java策略模式的簡單應用實現方法

    這篇文章主要介紹了Java策略模式的簡單應用實現方法,需要的朋友可以參考下
    2014-02-02
  • Java集合定義與用法實例總結【Set、List與Map】

    Java集合定義與用法實例總結【Set、List與Map】

    這篇文章主要介紹了Java集合定義與用法,結合實例形式總結分析了Java集合中Set、List和Map相關概念、功能、用法及操作注意事項,需要的朋友可以參考下
    2018-08-08
  • 使用Spring Boot AOP處理方法的入參和返回值

    使用Spring Boot AOP處理方法的入參和返回值

    這篇文章主要介紹了使用Spring Boot AOP處理方法的入參和返回值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • MyBatis游標Cursor的正確使用和百萬數據傳輸的內存測試

    MyBatis游標Cursor的正確使用和百萬數據傳輸的內存測試

    這篇文章主要介紹了MyBatis游標Cursor的正確使用和百萬數據傳輸的內存測試,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論