Socket网络编程回顾

Socket网络编程回顾

概述

Socket(套接字)是两台主机之间的逻辑连接点。Socket是通信的基石,支持TCP/IP协议的网络通信的基本操作单元。

它是网络通信过程中的端点的抽象表示,包含进行网络通信的五个基本要素信息:

​ 1.连接用的协议

​ 2.本地主机的IP+端口

​ 3.远程主机的IP+端口

Socket基本使用流程

​ Socket编程主要涉及到两个端:服务端和客户端(Server and Client).

​ 首先,在服务端创建一个服务器套接字(ServerSocket),并把它附加到一个端口上,服务器从这个端口进行监听。

​ 端口号的范围0-65535,共65526个,但是0到1023是保留端口号,所以我们一般取端口要大于1023并且不要取一些框架服务常用的端口号,比如3306,6379,8080,2081等等。

​ 为什么端口号是65536个,或者为什么端口号范围是0-65535(2^16 -1 ), 因为TCP、UDP协议的开头,会分别有16位存储源端口号和目标端口号,所以是65536个,范围是0-65535.

​ 客户端请求与服务器进行连接的时候,根据服务器的域名或者IP地址,加上端口号,打开一个套接字。当服务器接受了,也就是连接上了。

​ 那么服务端和客户端就会想输入和输出流一样进行操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NjDTnbAh-1617613286258)(C:\Users\王嘉程\AppData\Roaming\Typora\typora-user-images\image-20210405160634767.png)]

代码简单实现
1. 服务端代码
public class ServerDemo {

    public static void main(String[] args) throws IOException {
        // 创建线程池
        ExecutorService executorService = Executors.newCachedThreadPool();
        // 创建ServerSocket对象
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("这里是服务端!");
        while(true){
            Socket socket = serverSocket.accept();
            System.out.println("有客户端连接");
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    handle(socket);
                }
            });
        }
    }

    private static void handle(Socket socket){
        try {
            System.out.println("线程ID:" + Thread.currentThread().getId() +
                    " ,线程名称:" + Thread.currentThread().getName());
            InputStream is = socket.getInputStream();
            byte[] b = new byte[1024];
            int read = is.read(b);
            System.out.println("客户端:" + new String(b,0,read));
            // 连接中取出输入流并回话
            OutputStream os = socket.getOutputStream();
            os.write("没钱".getBytes());
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                // 关闭连接
                socket.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}

服务端代码可以分成两部分:1.创建线程池等待连接 2. 处理连接上的客户端请求

2.客户端代码
public class ClientDemo {

    public static void main(String[] args) throws IOException {
        while (true){
            // 连接 远程端口
            Socket socket = new Socket("127.0.0.1", 9999);
            // 从连接中socket取出outputStream 输出流并发送
            OutputStream outputStream = socket.getOutputStream();
            System.out.println("请输入:");
            Scanner scanner = new Scanner(System.in);
            String msg = scanner.nextLine();
            outputStream.write(msg.getBytes());
            // 从链接中取出输入流并回收流
            InputStream inputStream = socket.getInputStream();
            byte[] b = new byte[1024];
            int read = inputStream.read(b);
            System.out.println("老板说:" + new String(b, 0, read).trim());
            // 关闭socket
            socket.close();

        }
    }

}

这里只有一个方法,但仔细查看也可以分成三部分:

1. 连接远程主机端口 
2. 发送客户端想要的信息
3. 获取服务端返回的信息并显示出来
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值