zoukankan      html  css  js  c++  java
  • 第19章 网络通信----TCP程序设计基础

    TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样。

    1、InetAddress类

    java.net包中InetAddress类是与IP地址相关的类,利用该类可以获取IP地址、主机地址等信息。

    InetAddress类的方法会抛出UnknownHostException异常,所以必须进行异常处理。这个异常在主机不存在或网络连接错误时发生。

    例如:使用InetAddress类的getHostName()和getHostAddress()方法获得本地主机的主机名、本机IP地址。

    import java.net.*;
    
    public class Address { // 创建类
        public static void main(String[] args) {
            InetAddress ip; // 创建InetAddress对象
            try { // try语句块捕捉可能出现的异常
                ip = InetAddress.getLocalHost(); // 实例化对象
                String localname = ip.getHostName(); // 获取本机名
                String localip = ip.getHostAddress(); // 获取本IP地址
                System.out.println("本机名:" + localname);// 将本机名输出
                System.out.println("本机IP地址:" + localip); // 将本机IP输出
            } catch (UnknownHostException e) {
                e.printStackTrace(); // 输出异常信息
            }
        }
    }

    2、ServerSocket类

    3、TCP网络程序

    在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户机发送信息,称为单向通信。客户机套接字和服务器套接字连接成功后,客户机通过输出流发送数据,服务器则通过输入流接收数据。

    (1)首先建立一个TCP服务器程序,在getserver()方法中建立服务器套接字,调用getClientMessage()方法获取客户端信息。

      运行服务器端程序,将输出提示信息,等待客户呼机。

    import java.io.*;
    import java.net.*;
    
    public class MyTcp { // 创建类MyTcp
        private BufferedReader reader; // 创建BufferedReader对象
        private ServerSocket server; // 创建ServerSocket对象
        private Socket socket; // 创建Socket对象socket
        
        void getserver() {
            try {
                server = new ServerSocket(8998); // 实例化Socket对象
                System.out.println("服务器套接字已经创建成功"); // 输出信息
                while (true) { // 如果套接字是连接状态
                    System.out.println("等待客户机的连接"); // 输出信息
                    socket = server.accept(); // 实例化Socket对象
                    reader = new BufferedReader(new InputStreamReader(socket
                            .getInputStream())); // 实例化BufferedReader对象
                    getClientMessage(); // 调用getClientMessage()方法
                }
            } catch (Exception e) {
                e.printStackTrace(); // 输出异常信息
            }
        }
        
        private void getClientMessage() {
            try {
                while (true) { // 如果套接字是连接状态
                    if (reader.ready()) {
                        // 获得客户端信息
                        System.out.println("客户机:" + reader.readLine());
                    }
                }
            } catch (Exception e) {
                e.printStackTrace(); // 输出异常信息
            }
            try {
                if (reader != null) {
                    reader.close(); // 关闭流
                }
                if (socket != null) {
                    socket.close(); // 关闭套接字
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args) { // 主方法
            MyTcp tcp = new MyTcp(); // 创建本类对象
            tcp.getserver(); // 调用方法
        }
    }

    (2)然后建立一个客户端程序,实现将用户在文本框中输入的信息发送至服务器端,并将文本框中的输入的信息显示在客户端的文本域中。

    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.net.*;
    
    import javax.swing.*;
    import javax.swing.border.*;
    
    public class MyClien extends JFrame { // 创建类继承JFrame类
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private PrintWriter writer; // 声明PrintWriter类对象
        Socket socket; // 声明Socket对象
        private JTextArea ta = new JTextArea(); // 创建JtextArea对象
        private JTextField tf = new JTextField(); // 创建JtextField对象
        Container cc; // 声明Container对象
        
        public MyClien(String title) { // 构造方法
            super(title); // 调用父类的构造方法
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            cc = this.getContentPane(); // 实例化对象
    
            final JScrollPane scrollPane = new JScrollPane();
            scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
            getContentPane().add(scrollPane, BorderLayout.CENTER);
            scrollPane.setViewportView(ta);
            cc.add(tf, "South"); // 将文本框放在窗体的下部
            tf.addActionListener(new ActionListener() {
                // 绑定事件
                public void actionPerformed(ActionEvent e) {
                    // 将文本框中信息写入流
                    writer.println(tf.getText());
                    // 将文本框中信息显示在文本域中
                    ta.append(tf.getText() + '
    ');
                    ta.setSelectionEnd(ta.getText().length());
                    tf.setText(""); // 将文本框清空
                }
            });
        }
        
        private void connect() { // 连接套接字方法
            ta.append("尝试连接
    "); // 文本域中提示信息
            try { // 捕捉异常
                socket = new Socket("127.0.0.1", 8998); // 实例化Socket对象
                writer = new PrintWriter(socket.getOutputStream(), true);
                ta.append("完成连接
    "); // 文本域中提示信息
            } catch (Exception e) {
                e.printStackTrace(); // 输出异常信息
            }
        }
        
        public static void main(String[] args) { // 主方法
            MyClien clien = new MyClien("向服务器送数据"); // 创建本例对象
            clien.setSize(200, 200); // 设置窗体大小
            clien.setVisible(true); // 将窗体显示
            clien.connect(); // 调用连接方法
        }
    }

     

  • 相关阅读:
    最后之作-Last Order(bushi
    Hydra's plan
    CSP-S2019游记
    题解 P1407
    初赛排序知识
    题解 洛谷P3469
    二分图网络流知识总结
    题解 SGU294 He's Circles
    noip复习——逆元
    noip复习——线性筛(欧拉筛)
  • 原文地址:https://www.cnblogs.com/chamie/p/4715205.html
Copyright © 2011-2022 走看看