Java学习记录 网络通讯篇

TCP程序设计

TCP网络设计是利用Socket类(套接字)编写通信程序。
PS:套接字可以比作是一个连接装置(工具,像用电器必须要插插头连接才能使用!!

TCP协议进行通信应用程序分为 服务器程序 、 客户机程序

设计流程

  1. 创建服务器套接字
  2. 创建客户端套接字
  3. 服务器启动监听
  4. 处理传输数据(服务器、客户端)
  5. 启动服务器
  6. 启动客户端

IP处理

Class InetAddress

java.lang.Object
java.net.InetAddress

InetAddress类表示Internet协议(IP)地址。IP地址是由IP使用的32位或128位无符号数字,构建UDP和TCP协议的低级协议

InetAddress类常用方法

修饰符 方法 说明
String getHostName()  获取IP地址的主机名
String getHostAddress() 获取IP地址字符串
InetAddress getByName()  获取与Host对应的InetAddress对象
InetAddress getLocalHost() 返回本主机的InetAddress对象

其余的方法自查API

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Address {
     
    public static void main(String[] args) {
     
        try {
     
            InetAddress ip = InetAddress.getLocalHost();
            String myname = ip.getHostName();
            String myip = ip.getHostAddress();
            System.out.println("本机名:"+myname);
            System.out.println("本机IP:"+myip);

        } catch (UnknownHostException e) {
     
            e.printStackTrace();
        }

    }
}

服务器套接字

Class ServerSocket

java.lang.Object
java.net.ServerSocket

ServerSocket类 实现了服务器套接字。等待通过网络进入的请求。服务器会根据该请求执行一些操作,然后可能将结果返回给请求者

构造方法

ServerSocket() :创建未绑定的服务器套接字
ServerSocket(int port)
:指定端口
ServerSocket(int port, int backlog) :指定端口并设置连接上限
ServerSocket(int port, int backlog, InetAddress bindAddr) :指定端口并设置连接上限和绑定IP地址

参数说明

**port:**端口号
**backlog:**请求进入连接队列的最大长度
**bindAddr:**服务器将绑定到的本地InetAddress

ServerSocket类常用方法

修饰符 方法 说明
Socket accept() 等待客户端的连接,连接则创建套接字
boolean isBound()  判断ServerSocket的绑定状态
InetAddress getInetAddress()  获取服务器套接字的本地地址
boolean isClosed()  获取服务器套接字的关闭状态
void close() 关闭服务器套接字
void bind(SocketAddress endpoint) 将ServerSocket绑定到特定地址(IP地址、端口号)

其余的方法自查API

客户端套接字

Class Socket
java.lang.Object
java.net.Socket

Socket类 实现客户端套接字, 套接字是两台机器之间通讯的端点

构造方法

Socket()  :创建未连接的套接字
Socket(IntetAddress address , int port) :连接指定IP和端口号
Socket(String host , int port)  :连接指定主机和端口号

Socket类常用方法

修饰符 方法 说明
InputStream getInputStream() 获取套接字输入流
OutputStream getOutputStream()  获取套接字输出流
boolean isConnected()  查看套接字是否连接
void close() 关闭套接字
InetAddress getInetAddress() 返回连接主机的地址

其余的方法自查API

实现TCP协议通讯

服务端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MyTcp {
     

    //缓存字节输入流
    private BufferedReader reader;
    private ServerSocket server;
    private Socket socket;

    //服务器套接字连接并接收数据
    private void getserver() {
     
        try {
     
            server = new ServerSocket(8998);
            System.out.println("服务器套接字已经创建");
            while (true) {
     
                System.out.println("等待客户端的连接....");
                socket = server.accept();
                //形式: 缓存字符流 <- 字符流 <- 字节流
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //接收客户端消息
                getClinetMessage();
            }
        } catch (IOException e) {
     
            e.printStackTrace();
        }
    }

    private void getClinetMessage(){
     
        try {
     
            while (true){
     
                System.out.println("客户端:"+reader.readLine());
            }
        } catch (IOException 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();
    }
}

客户端:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;

public class MyClien extends JFrame {
     

    //输出流 ,方便打印输出
    private PrintWriter writer;
    private Socket socket;
    //多行文本 (文本域
    private JTextArea ta = new JTextArea();
    //单行文本
    private JTextField tf = new JTextField();
    //滚动条
    JScrollPane scrollPane = new JScrollPane(ta);
    private Container c = getContentPane();

    public MyClien(String title){
     
        super(title);
        setDefaultCloseOperation(3);
        ta.setFont(new Font("微软雅黑",Font.PLAIN,20));
        tf.setFont(new Font("微软雅黑",Font.PLAIN,20));
        //添加并设置布局
        c.add(scrollPane , BorderLayout.CENTER);
        c.add(tf , BorderLayout.SOUTH);
        tf.addActionListener(new AbstractAction() {
     
            @Override
            public void actionPerformed(ActionEvent e) {
     
                writer.println(tf.getText());
                ta.append(tf.getText()+"\n");
                ta.setSelectionEnd(ta.getText().length());
                tf.setText("");
            }
        });
    }

    private void connect(){
     
        ta.append("尝试连接\n");
        try {
     
            socket = new Socket("127.0.0.1" , 8998);
            //参数2:刷新缓冲区中的数据 (开
            writer = new PrintWriter(socket.getOutputStream() , true);
            ta.append("连接成功\n");
        } catch (IOException e) {
     
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
     
        MyClien clien = new MyClien("向服务器送数据");
        clien.setBounds(400 , 300 , 300 , 250);
        clien.setVisible(true);
        clien.connect();
    }
}

先运行 服务端 再运行 客户端

你可能感兴趣的:(Java,学习记录,java)