• socket通信


    socket通信分为tcp协议以及udp协议,

      tcp协议与udp协议的区别

      tcp没有大小限制,upd有大小限制

      udp效率更高,tcp效率不高,因为tcp每次都需要握手,而udp不需要握手

      tcp要建立连接要经历三次握手,第一次:告诉服务器,我来了;第二次:服务器收到请求后,告诉客户端,我知道了,你可以传数据了;第三次:客户端收到服务器的确认信息,告诉服务器我要开始传数据了。tcp协议传输数据是即时的,即客户端发送数据后,服务器当时就能收到数据,因此要维护连接状态。

      而udp协议并不需要三次握手,使用udp协议传数据前,客户端与服务器之间不建立连接,因此也就不需要维护连接状态。

    使用tcp协议简单的创建一个数据连接服务器以及客户端

    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * 服务器端程序流程
     * 1.打开指定端口的服务器端对象ServerSocket
     * 2.等待客户端的连接
     * 3.读取客户端信息
     * 4.关闭连接
     */
    public class SocketServer {
        public static void main(String[] args) {
            ServerSocket ss = null;
            Socket socket = null;
            try {
                /*1.创建服务器对象*/
                ss = new ServerSocket(9999);
                /*2.等待客户端的连接,如果没有客户端的连接,那么线程会一直处于阻塞状态,当有客户端连接时,程序才会向下运行*/
                socket = ss.accept();
                System.out.println("客户端ip"+socket.getInetAddress()+"发出请求");
                /*获取输出流,读取客户端发送的数据*/
                InputStream in = socket.getInputStream();
                /*创建数组对象,读取数据*/
                byte[] b = new byte[1024];
                int len =0 ;
                in.read(b);
                String s = new String(b, 0, b.length);
                System.out.println("客户端数据为:"+s);
    
                /*获取输入流,给客户端响应数据*/
                OutputStream out = socket.getOutputStream();
                out.write("好了好了,我知道了,不要再说了".getBytes());
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
        }
    }
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class ClientDemo {
        public static void main(String[] args) {
            Socket socket = null;
            try {
                /*1.得到指定ip,指定端口的服务器端的连接*/
                socket = new Socket("127.0.0.1", 9999);
                /*获取输入流,向服务器端发送数据*/
                OutputStream out = socket.getOutputStream();
                out.write("hello world".getBytes());
    
                Thread.sleep(10000);
    
                /*获取输出流对象,读取服务器的响应*/
                InputStream in = socket.getInputStream();
                byte[] b = new byte[1024];
                int len = 0;
                while ((len = in.read(b))!=-1) {
                    String s = new String(b, 0, len);
                    System.out.println("服务器响应为" + s);
                }
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    以上代码因为执行速度不一样,因此可能服务器响应前客户端就执行完了,因此可以打断点来获取服务端响应

      

  • 相关阅读:
    Linux更新时,出现无法更新锁
    Linux显示su:认证失败
    08 redis的缓存预热,雪崩,击穿,穿透问题以及常用的监控参数
    06 redis的哨兵系统的工作流程
    05 redis的主从复制机制的工作流程以及相关基础知识
    03 redis的事务以及锁、过期数据的删除策略、逐出算法、配置文件的核心配置参数
    02 jedis以及redis的持久化
    01 redis的5种基本数据类型的介绍,使用以及应用场景
    M1 MySQL事务知识点的总结
    02 Java文件读写通道的使用以及文件的基本操作方法
  • 原文地址:https://www.cnblogs.com/Zs-book1/p/11135070.html
Copyright © 2020-2023  润新知