Java Socket通信小结

Java中的网络支持


InerAddress

用于标识网络上的硬件资源。标识互联想协议(IP)地址。
无构造方法,只能通过getXXX方法得到(static InetAddress)

测试代码


InetAddress address = InetAddress.getLocalHost();
    System.out.println("计算机名"+address.getHostName());
    System.out.println("IP address"+address.getHostAddress());
    byte[] bytes = address.getAddress();//字节数组形式的IP
    System.out.println("字节形式数组的形式"+Arrays.toString(bytes));
    System.out.println("---输出InetAddress实例----");
    System.out.println(address);//直接输出address对象
    /*根据机器名获取InetAddress实例*/
    InetAddress address2 = InetAddress.getByName("Jian-PC");
    /*根据IP获取InetAddress实例*/
    InetAddress address3 = InetAddress.getByName("169.254.76.89");

输出结果

计算机名Jian-PC
IP address169.254.76.89
字节形式数组的形式[-87, -2, 76, 89]
---输出InetAddress实例----
Jian-PC/169.254.76.89

URL

统一资源定位符,通过URL可以直接读取或写入网络上的数据。
由两部分组成 协议名资源名

常用方法


    String immoc = new URL("http://www.imooc.com");
    /*根据父URL指定子URL,?后面为参数,#后面为锚点*/
    URL url = new URL(immoc, "/index.html?username=tom#test");
    System.out.println("协议:"+url.getProtocol());
    System.out.println("主机:"+url.getHost());
    /*如果未指定端口号,则使用默认端口号,此时getPort()返回值为-1*/
    System.out.println("端口号:"+url.getPort());
    System.out.println("文件路径:"+url.getPath());
    System.out.println("文件名:"+url.getFile());
    System.out.println("相对路径:"+url.getRef());
    System.out.println("c查询字符串:"+url.getQuery());

使用URL读取网页内容

  • 使用URL对象的openStream()方法得到指定资源的输入流
  • 通过输入流可以访问网上的资源
代码如下:
        //使用URL读取页面内容
            //抓取到百度页面的代码
            try {
                //创建一个URL实例
                URL url = new URL("http://www.baidu.com");
                //通过URL的openStreeam()方法获取URL对象所表示的资源的字节输入流
                InputStream is = url.openStream();
                //将字节输入流转换为字符输入流,指定编码格式
                InputStreamReader isr = new InputStreamReader(is,"utf-8");
                //为字符输入流添加缓冲
                BufferedReader br = new BufferedReader(isr);
                String data = br.readLine();//读取数据
                while(data!=null){
                    System.out.println(data);
                    data = br.readLine();
                }
                br.close();
                isr.close();
                is.close();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }catch (IOException e) {
                // TODO: handle exception
            }

这段代码主要显示了http://www.baidu.com首页的源代码,大家可以把它写入一个html,打开网页即可显示百度首页的页面

Sockets

使用TCP协议实现网络通信的Socket相关的类。
TCP协议是面向连接、可靠的、有序的,以字节流的方式发送数据。
基于TCP协议实现网络通信的类有以下两类:

  • 客户端的Socket类
  • 服务器端的ServerSocket类

Socket通模型


Server端

  1. 创建ServerSocket对象,绑定监听端口,使用accept()方法监听客户端请求,注意阻塞与非阻塞。
  2. 利用inputstream、outputstream开始通信
  3. 关闭socket及相关资源

Client端

  1. 创建连接socket对象,指明需要连接的服务器的地址和端口号。
  2. 利用inputstream、outputstream开始通信
  3. 关闭socket及相关资源

你的网速不给力喔


Socket通信实现步骤

1. 创建ServerSocket和Socket
2. 打开连接到Socket的输入输出流
3. 按照协议对Socket进行读/写操作
4. 关闭输入输出流、关闭Socket

多线程TCP Socket通信实例

Datagram

使用UDP协议,将数据保存在数据报中,通过网络进行通信,无连接、不可靠、无序
优点是速度快,做传输时,将数据定义成数据包Datagram,在数据包中指定索要达到的Socket(主机号和端口号)

相关类

  • DatagramPacket 表示数据报包
  • DatagramSocket 进行端到端通信的类

用法demo


服务器端

  1. 创建DatagramSocket,指定端口号
  2. 创建DatagramPacket
  3. 接收客户端发送的数据信息
  4. 读取数据

客户端

  1. 定义发送信息
  2. 创建DatagramPacket,包含将要发送的信息
  3. 创建DatagramSocket,发送数据
  4. 发送数据

多线程UDP Socket通信实例

一些注意事项

  1. Socket通信过程中,可以提高开启线程的优先级,提升反应速度。
  2. 一般不用关闭输入输出流,直接关闭socket就可以。
  3. 在使用TCP传输对象时,可以使用ObjectIn/OutputStram流装饰输入输出流来传输。
  4. socket传输文件可以结合Java FileIO来做
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值