TCP 통신을 구현하려면 먼저 서버 측 프로그램과 클라이언트 측 프로그램을 만들어야 합니다. 데이터 전송의 보안을 위해서는 먼저 서버 측 프로그램을 구현해야 합니다. 프로그램을 작성한 다음 클라이언트 프로그램을 작성합니다.
로컬 컴퓨터에서 서버 프로그램을 실행하고 원격 컴퓨터에서 클라이언트 프로그램을 실행하세요
로컬 컴퓨터의 IP 주소: 192.168.129.222
원격 컴퓨터의 IP 주소: 192.168.214.213
net.hw.network 패키지에 서버 클래스를 생성합니다
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]가 연결되어 있는 것입니다.
4. 프로그램 최적화 아이디어 - 서버는 멀티스레딩을 사용합니다.
🎜사실 , 많은 서버 측 프로그램은 여러 사용자가 동시에 액세스할 수 있는 포털과 같은 여러 응용 프로그램에서 액세스할 수 있으므로 서버 측은 다중 스레드입니다. 🎜🎜🎜🎜위 내용은 Java에서 TCP 기반의 간단한 채팅 프로그램을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!