java云服务开发学习之javaSocket知识点学习

举报
breakDawn 发表于 2020/09/28 20:32:13 2020/09/28
【摘要】 Server端java代码要点:用accept开启一个Socket1InputStream inputStream = socket.getInputStream();while ((len = inputStream.read(bytes)) != -1) {3// 注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-84sb.append(new String(bytes, 0,...

Server端java代码要点:

  • 用accept开启一个Socket

1InputStream inputStream = socket.getInputStream();while ((len = inputStream.read(bytes)) != -1) {3// 注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-84sb.append(new String(bytes, 0, len, "UTF-8"));5}
  • 如果server端要返回数据,就再从socekt对象里get输出流,往输出流里写东西,就会传到对方那边

1serverSocket.setSoTimeout(6000);
  1. SO_REUSEADDR 是否支持复用端口
    即另一个ServerSocket还没有close时, 新的ServerSocket能否重用之前那个ServerSocket的端口。

1serverSocket.setReceiveBufferSize(130172);//把缓冲区的大小设置为128KB

Q: 客户端进行输出流输出时,如果执行了outputStream.close()后, 还需要执行socket.close()吗
A:
不需要。对于同一个socket,如果关闭了输出流比如(pw.close()),则与该输出流关联的socket也会关闭,所以一般不需要关闭输出流,当关闭socket的时候,输出流也会关闭。
因此如果有以下代码:

1// 与服务端建立连接2Socket socket = new Socket(host, port);3// 建立连接后获得输出流4OutputStream outputStream = socket.getOutputStream();5String message="你好  yiwangzhibujian";6socket.getOutputStream().write(message.getBytes("UTF-8"));
  • java中UDP的socket客户端建立时,不需要指定对端的ip和端口。
    需要发送目的地的ip端口,在发送的DatagramPacket里去指定
    (即我这个DatagramSocket可以用来发好多不同目的ip的DatagramPacket)


image.png

另一个区别是, tcp两边以流来传输数据, 但是udp以DatagramPacket来传递数据。


Q: MulticastSocket是什么?
A:
多点广播的socket实现。也是用DatagramPacket来传输数据,
类似于1个客户端可以把数据报发给好几个目的端。
multicastSocket.joinGroup(多播ip)
则该socket会加入到这个多播组中,
即假设环境中有4个MulticastSocket,分别为socketA、socketB、socketC、socketD
当socketA、socketB、socketC都通过joinGroup方法,加入了224.0.0.1这个多播ip
那么当socketA发送了某个DatagramPacket时,会同时发送给B和C, 但不会发给D。


Q: socketA会发送给自己吗?
A:
广播时发给自己那就是环回,loopback
区别于loopbackMode设置

  • 如果执行过multicaseSocket.setLoopbackMode(true),则是禁用环回机制(这个别搞混,注意看参数名是disable,是否禁用)。
    image.png

  • 默认启用环回机制
    image.png

参考资料:
https://blog.csdn.net/a78270528/article/details/80318571(这篇写得很棒)
https://blog.csdn.net/woshisap/article/details/6597413
https://blog.csdn.net/weixin_44618862/article/details/98480120

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。