zoukankan      html  css  js  c++  java
  • java套接字(socket)实例

    客户端socket

    流程:

    1、连接远程主机

    2、发送数据

    3、接收数据

    4、关闭流与socket连接

    实例:

    import java.io.*;
    import java.net.Socket;
    import java.util.Date;
    
    /**
     * Created by CLY on 2017/7/11.
     */
    public class ClientSocket {
        public static void main(String[] arg){
            int port = 233;//与之连接的服务端套接字的端口号
            String host = "127.0.0.1";//与之连接的服务端套接字ip地址
            Socket socket = null;
            try {
                //创建socket连接,即在该Socket构造函数返回之前,就会与远程主机建立连接,如果未能连接,则会抛出异常。
                socket = new Socket(host, port);
    
                //获取输出流,向服务器端发送当前时间
                OutputStream outputStream = socket.getOutputStream();
                Writer writer = new OutputStreamWriter(outputStream);
                String now_date = new Date().toString();
                writer.write("客户端当前时间为——"+now_date);
                writer.flush();
                ////关闭客户端的输出流。相当于给流中加入一个结束标记-1.这个样子服务器的输入流的reaLine方法就会读到一个-1,然后结束readLIne方法。
                socket.shutdownOutput();
    
                //获取输入流,并读取服务器端的响应信息
                InputStream inputStream= socket.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
                String server_info = null;
                while((server_info=br.readLine())!=null){
                    System.out.println("服务端传过来的值:"+server_info);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //如果socket不为null,则释放掉它
                if (socket!=null){
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    服务端Socket

    流程:

    1、绑定端口

    2、监听入站数据

    3、在绑定的端口上接受来自远程机器的连接

    4、接收数据

    5、发送数据

    6、关闭流与socket连接

    实例:

    import java.io.*;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Date;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * Created by CLY on 2017/7/11.
     */
    public class MyServerSocket {
        public static void main(String[] arg){
            /**
             * 根据tcp协议可知,所谓套接字(socket)是指一个由“ip地址+端口”组成的组合。
             * 而每一台主机的ip地址都是确定的,不需要我们来指定,
             * 所以构建服务器socket的第一步就是确定端口
             */
            try {
                int port = 233;//端口号
                int queueLength = 50;//最大入站连接
                InetAddress bindAddress = InetAddress.getByName("127.0.0.1");//只监听该ip的指定端口
                ExecutorService pool = Executors.newFixedThreadPool(50);//创建一个最大容量为50的线程池,为每一个入站连接分配一条线程。
    
                //创建一个端口为“233”的服务器socket
                ServerSocket serverSocket = new ServerSocket(port);
    
                //创建一个端口为233的服务器socket,且队列一次最多能保存50个入站连接
                //ServerSocket serverSocket = new ServerSocket(port,queueLength);
    
                //假设一台主机有多个ip地址,则服务器socket会默认在所有ip地址的指定端口上监听,但可以指定其只监听指定ip的端口。
                //ServerSocket serverSocket = new ServerSocket(port,queueLength,bindAddress);
    
                while (true){
                    //accept()调用会阻塞,会一直等到有客户端连接到指定socket端口为止。
                    final Socket connection = serverSocket.accept();
    
                    //线程池中拿取一条线程来处理socket连接。然后主程序运行下一个循环,继续等待下一个客户端的访问。
                    pool.execute(new Runnable() {
                        public void run() {
                            try {
                                //从输入流中读取获取客户端传过来的值
                                InputStream inputStream= connection.getInputStream();
                                BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
                                String client_info = null;
                                while((client_info=br.readLine())!=null){
                                    System.out.println("客户端传过来的值:"+client_info);
                                }
    
                                //测试:将当前时间写入流中返回给客户端
                                Writer writer = new OutputStreamWriter(connection.getOutputStream());
                                String nowData = new Date().toString();
                                writer.write("服务端当前时间为——"+nowData);
                                writer.flush();
                            } catch (IOException e) {
                                e.printStackTrace();
                            } finally {
                                try {
                                    //关闭socket连接
                                    connection.close();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    });
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
  • 相关阅读:
    arthas常用命令记录
    idea 的 http-client
    springboot 接口层参数校验 自定义参数校验
    Spring AOP 实现——使用annotation、pointcut、aspect
    Redis 热点名词
    SpringCloud注册发现配置
    【设计模式】-行为型-11-解释器模式
    【设计模式】-行为型-10-备忘录模式
    【设计模式】-创建型-9-访问者模式
    Kubernetes运行原理
  • 原文地址:https://www.cnblogs.com/red-code/p/7153472.html
Copyright © 2011-2022 走看看