socket客户端是怎样和服务端通信的理解

本文介绍了socket的基本概念,包括其作为服务端主机和端口号与客户端主机和端口号的组合。讨论了socket数据的来源,是从网卡的接收队列读取。还讲解了ServerSocket对象的参数意义,以及TCP的三次握手和四次挥手过程,确保可靠的数据传输。最后,提到了TCP连接释放的TIME-WAIT阶段的作用。
摘要由CSDN通过智能技术生成

socket 是什么

socket是套接字,那么什么是套接字呢?简单来说就是服务端的主机和端口号加上客户端的主机加上端口号加上通信协议等信息,我们可以看到下图

import java.net.ServerSocket;

/**
 * @author zjl
 * @date 2022/10/9 10:04
 */
public class SocketServerTest
{
   
    public static void main(String[] args)
    {
   
        try {
   
        	//创建服务器的监听socket,
            ServerSocket serverSocket = new ServerSocket(12345);
            //这主要是为了阻塞程序,不让程序中断
             System.in.read();
        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }
}

使用nc在linux上连接:nc 127.0.0.1 12345,可以看到已经客户端nc已经和端口12345的服务端建立连接了
在这里插入图片描述
解释一下:网络模式我们可以分为七层,后面改成了五层,应用层(应用层、表示层、会话层现在合并成了一层),传输层、网络层、数据链路层、物理层。程序员我们只需要关系应用层,其他的不需要关心。内核会帮我们计算机双方给连接起来。此时我们是可以发送数据。那么我们是不是有疑问,每次socket是从哪里读取的数据呢?很多人都知道是从网卡,那么这个是有点泛泛,那么到底是从哪里呢?

socket数据是从哪里读取出来的

我们在nc 上发送数据xxx
在这里插入图片描述

我们再次使用命令 netstat -anp 发送服务端的接收队列存在数据
在这里插入图片描述
为啥是4呢?我们明明发送三个字符的,其实这里面还有一个换行符。所以我们看到数据其实发送到接收队列里面去了,所以socket去读取数据的时候也是去接收队列去读取的。那么我们又有一个疑问,那么其他客户端是怎样读取数据的呢?那么这个又验证了什么是socket了,因为一个套接字:服务端端口号和服务端ip加上客户端的ip和客户端的端口以及发送队列和接受对列组成的,但是每个sokcet保证(服务端ip和端口加客户端的ip和端口号)是唯一的。这样读取和接收的都是自己的数据

ServerSocket对象

import java.net.ServerSo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 上实现 Socket 客户端服务端通信,可以通过 JavaSocket 编程实现。下面是一个简单的示例: 1. 服务端代码: ```java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("服务器已启动,等待客户端连接..."); while (true) { Socket socket = serverSocket.accept(); System.out.println("客户端已连接:" + socket.getInetAddress()); Thread thread = new Thread(new ServerThread(socket)); thread.start(); } } } ``` 2. 服务端线程代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class ServerThread implements Runnable { private Socket socket; public ServerThread(Socket socket) { this.socket = socket; } @Override public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str; while ((str = reader.readLine()) != null) { System.out.println("客户端发送消息:" + str); } } catch (IOException e) { e.printStackTrace(); } } } ``` 3. 客户端代码: ```java import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) throws UnknownHostException, IOException { Socket socket = new Socket("localhost", 8888); OutputStream outputStream = socket.getOutputStream(); outputStream.write("Hello Server".getBytes()); outputStream.flush(); socket.shutdownOutput(); socket.close(); } } ``` 在服务端启动后,等待客户端连接,当客户端连接后,开启一个线程处理客户端的请求。客户端通过 Socket 连接到服务端,发送消息后关闭连接。 注意:以上代码仅为示例,没有进行异常处理等操作,实际使用时需要根据具体需求补充完整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值