zoukankan      html  css  js  c++  java
  • java实现最基础的socket网络通信

    一、网络通信基础

    网络中存在很多的通信实体,每一个通信实体都有一个标识符就是IP地址。

    而现实中每一个网络实体可以和多个通信程序同时进行网络通信,这就需要使用端口号进行区分。

    二、java中的基本网络支持

    1、IP地址使用InetAddress类来表示。

         获取InetAddress实例的两个方法为:

        (1)getByName(String host)    根据主机获取对应的InetAddress对象

        (2)getByAddress(byte[] addr)根据IP地址获取InetAddress对象

    2、InetAddress提供了三个方法来获取InetAddress实例对应的IP地址和主机名

        (1)String getCanonicalHostName()获取此IP地址的权限定域名

        (2)String getHostAddress()获取InetAddress实例对应的IP地址

        (3)String getHostName()获取此IP地址的主机名

    此外InetAddress类使用getLocalHost()方法获取本机IP地址对应的InetAddress实例,使用isReachable()方法测试是否可以到达该地址。

    三、java实现简单的TCP/IP通信

    服务器端使用ServerSocket创建TCP服务器,使用accept()进行监听,如果接收到客户端请求则返回一个与客户端对应的Socket,否则处于等待状态。

    客户端根据服务器的IP,连接服务器。

    服务器代码:

    import java.net.*;
    import java.io.*;
    /**
    手机端代码
    手机端作为服务器,获取自己的ip地址,并显示以供客户端连接
    */
    public class phone_Server
    {
        public static void main(String[] args)
            throws IOException
        {
            //打印本机的IP地址
            InetAddress address=InetAddress.getLocalHost();
            System.out.println("本机的IP地址是"+address.getHostAddress());
            // 创建一个ServerSocket,用于监听客户端Socket的连接请求
            ServerSocket ss = new ServerSocket(30000);
            // 采用循环不断接受来自客户端的请求
            while (true)
            {
                // 每当接受到客户端Socket的请求,服务器端也对应产生一个Socket
                Socket s = ss.accept();
                // 将Socket对应的输出流包装成PrintStream
                PrintStream ps = new PrintStream(s.getOutputStream());
                // 进行普通IO操作
                ps.println("您好,您收到了服务器的新年祝福!");
                // 关闭输出流,关闭Socket
                ps.close();
                s.close();
            }
        }
    }

    客户端代码:

    /**
    PC端代码
    PC作为客户端,根据服务器的IP地址和端口号连接服务器
    */
    import java.net.*;
    import java.io.*;
    
    public class PC_Client
    {
        public static void main(String[] args)
            throws IOException
        {
            //Socket socket = new Socket("127.0.0.1" , 30000);
            Socket socket = new Socket("192.168.47.1" , 30000);//这里的IP地址填写手机端服务器的IP地址
            // 将Socket对应的输入流包装成BufferedReader
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            // 进行普通IO操作
            String line = br.readLine();
            System.out.println("来自服务器的数据:" + line);
            // 关闭输入流、socket
            br.close();
            socket.close();
        }
    }

      补充一点socket传输大数据的内容

    由于socket单次传输的数量是有一定的限制的,所以应该分批次传输和接受

    可以写成这样:

    传输

                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                    int start=0;
                    while((start+1024)<data.length)
                    {
                        out.write(data, start,1024);
                        start=start+1024;
                    }
                    if(start<data.length)
                    {
                        out.write(data, start,(data.length-start+1));
                    }
                    //String str = new String(data);
                    //out.writeUTF(str);
                }catch (Exception e) {
                    Log.d(TAG, "文件传输异常");
                }

    接受

            DataInputStream input = new DataInputStream(socket.getInputStream());
            byte []buf=new byte[1024];
            int readnum=0;
            while(true)
            {
                readnum=input.read(buf); 
                if(readnum>0)
                {
                    System.out.println(Arrays.toString(buf));
    
                    while((readnum=input.read(buf))>0)
                    {
                        System.out.println(Arrays.toString(buf));
                    }
                }
            }
  • 相关阅读:
    Spring:(八) mybatis-spring整合
    Spring:(七) Aop
    spring boot中@ControllerAdvice的用法
    spring boot中注册拦截器
    spring boot 中通过CORS实现跨域
    spring boot 中的路径映射
    浅析java中的string
    java并发编程如何预防死锁
    Redis集群增加节点和删除节点
    Redis删除集群以及重新启动集群
  • 原文地址:https://www.cnblogs.com/bewolf/p/4642723.html
Copyright © 2011-2022 走看看