6.Java Socket基础编程

Socket分为两种:
服务器ServerSocket和普通Socket,其中服务器Socket用于接收客户端的连接,一般来说,一个服务器套接字可以被多个普通套接字连接。

1.创建服务器ServerSocket等待连接Demo

package InternetCode.Socket.Exa6_1;
import java.net.*;
import java.util.Arrays;
public class ServerSocketDemo {
    //声明ServerSocket对象
    private ServerSocket server;
    //声明Socket对象socket
    private Socket socket;
    public void getServer() {
        try {
            // 根据端口号实例化服务器Socket对象
            server = new ServerSocket(1978);
            System.out.println("服务器套接字已经创建成功\n");
            //循环等待套接字连接
            while (true) {
                System.out.println("等待客户机的连接......\n");
                socket = server.accept();
                System.out.println(socket.getInetAddress().getHostAddress() +"连接成功......\n");
            }
        } catch (Exception e) {
            e.printStackTrace(); // 输出异常信息
        }
    }

    // 主方法
    public static void main(String[] args) {
        // 创建本类对象
        ServerSocketDemo frame = new ServerSocketDemo();
        // 调用方法创建服务器套接字
        frame.getServer();
    }
}

在这里插入图片描述

2.普通Socket连接服务端Demo

package InternetCode.Socket.Exa6_1;
import java.net.Socket;
public class ClientSocketDemo {
    // 声明Socket对象
    private Socket socket;
    /**
     * 连接套接字方法
     */
    private void connect() {
        System.out.println("尝试连接......\n");
        try {
            // 实例化Socket对象
            socket = new Socket("127.0.0.1", 1978);
            System.out.println("完成连接。\n");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 主方法
    public static void main(String[] args) {
        // 创建本例对象
        ClientSocketDemo clientSocketDemo = new ClientSocketDemo();
        // 调用连接方法
        clientSocketDemo.connect();
    }
}

在第一个demo运行的前提下,运行第二个例子:
在这里插入图片描述

3.设置服务器等待连接超时时间

package InternetCode.Socket.Exa6_1;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.SocketTimeoutException;

/**
 * 设置服务器等待连接的超时时间
 */
public class ServerTimeOutSet {
    private ServerSocket server; // 声明ServerSocket对象

    public void getServer() {
        try {
            server = new ServerSocket(1978); // 实例化Socket对象
            // 设置连接超时时间为10秒 ,执行accept后10秒后若没有客户端连接,则抛出异常
            server.setSoTimeout(5000);
            // 输出信息
            System.out.println("服务器套接字已经创建成功\n");
            while (true) {
                //输出信息
                System.out.println("等待客户机的连接......\n");
                // 等待客户机连接
                server.accept();
            }
        } catch (SocketTimeoutException e) {
            System.out.println("连接超时......");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        // 创建本类对象
        ServerTimeOutSet frame = new ServerTimeOutSet();
        // 调用方法
        frame.getServer();
    }
}

这个程序主要加上了设置连接超时的时间。

4.获取远程连接套接字的ip和端口号

客户端:

package InternetCode.Socket.Exa6_2;
import java.net.*;
/**
 * 获取远程连接套接字的ip和端口号
 */
public class ClientSocketFrame {
    // 声明Socket对象
    private Socket socket;

    /**
     * 连接套接字方法
     */
    private void connect() {
        System.out.println("尝试连接......\n");
        try {
            // 客户端根据ip和端口号尝试创建socket时,
            // 其实就是建立一个tcp连接
            //如果创建成功则是连接成功
            socket = new Socket("127.0.0.1", 1978);
            System.out.println("完成连接。\n");
            // 获得远程服务器的地址
            InetAddress netAddress = socket.getInetAddress();
            // 获得远程服务器的IP地址
            String netIp = netAddress.getHostAddress();
            // 获得远程服务器的端口号
            int netPort = socket.getPort();
            // 获得客户端的地址
            InetAddress localAddress = socket.getLocalAddress();
            // 获得客户端的IP地址
            String localIp = localAddress.getHostAddress();
            // 获得客户端的端口号
            int localPort = socket.getLocalPort();
            System.out.println("远程服务器的IP地址:" + netIp + "\n");
            System.out.println("远程服务器的端口号:" + netPort + "\n");
            System.out.println("客户机本地的IP地址:" + localIp + "\n");
            System.out.println("客户机本地的端口号:" + localPort + "\n");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ClientSocketFrame client = new ClientSocketFrame();
        client.connect();
    }
}

服务端:

package InternetCode.Socket.Exa6_2;
import java.net.*;

/**
 * 获取远程连接套接字的ip和端口号
 */
public class ServerSocketFrame{
    // 声明ServerSocket对象
    private ServerSocket server;
    // 声明Socket对象socket
    private Socket socket;

    public void getServer() {
        try {
            // 实例化Socket对象
            server = new ServerSocket(1978);
            // 输出信息
            System.out.println("服务器套接字已经创建成功\n");
            while (true) {
                // 输出信息
                System.out.println("等待客户机的连接......\n");
                // 等待连接
                socket = server.accept();
                System.out.println("连接成功......\n");
                System.out.println("连接的客户端ip为:"+socket.getInetAddress().getHostAddress());
                System.out.println("连接的客户端的端口号为: "+socket.getPort());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        ServerSocketFrame frame = new ServerSocketFrame();
        frame.getServer();
    }


}

首先运行服务端:
在这里插入图片描述

然后运行客户端:
在这里插入图片描述
再看服务端:
在这里插入图片描述

代码地址:

https://gitee.com/yan-jiadou/study/tree/master/Java%E5%8A%A8%E6%89%8B%E5%81%9A%E4%B8%80%E5%81%9A/src/main/java/InternetCode/Socket

作者:small-water

出处:https://www.cnblogs.com/small-water/p/17870093.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   文牧之  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示