Skip to content

只记java不一样的地方.


网络软件架构

CS

server - client模式 特指要下载APP的

BS

browser - Server 特指使用浏览器访问的


InetAddress

3df39ffe5476b681dbd498a9a71ac91f_MD5 创建时,会根据底层是ipv4还是ipv6返回对应的子类. 它没有公开的构造函数,只能通过静态方法获取

a22175332f3926a01059932c45267763_MD5 第一个方法其实就是进行一次dns查询. 其中第二个方法: 如果局域网中没有这个主机,会返回ip


udp有关

发送数据

7806b0303defe7bbb9b039046c6341a4_MD5 DatagramPacket的参数: 99479905c562c8c2dd8d72cf0dc30cc2_MD5

接收数据

a7ffde8f31d7732f87dbe7ec43773cd3_MD5 receive是阻塞的.

组播与广播

我们之前写的都是单播 34e62f9ced27f448ae4e5dbf06f4d08d_MD5 9d7fe1093c3ca7542d7e9481fc161c7f_MD5

组播

其实就是同时给许多主机发送

发送端

da578a1ba011a6ce9a9fd49dfb47e19c_MD5

接收端

d94b4b84085715a64266a27e20cff9ec_MD5

广播

只需要修改单播代码的ip都行

发送端

13b943c8c3e35957471a308ba6d5fee4_MD5 tip:广播是udp独有的,tcp是没有的.


tcp有关

7346acd5c44de4da6107aa3f6bdb5798_MD5 注意,只能写字节byte.

客户端

c4f3172a1b55052b38e6a6129f1ed6b0_MD5

服务端

33b51b95f4675e5937277da197b8872b_MD5

汉字乱码问题

我们刚才的写法,如果传递中文,会接收到乱码.这是因为tcp传递的是字节流,服务端接收的都是一个一个的字节.而中文并不是一个字节,因此服务端就解析成了乱码.因此我们可以转化成字符流 2930c7e2e256211a9a8b72bc1ab44b21_MD5 提高效率: 946378de70f2a804c42102f097175318_MD5

细节

事实上,客户端只需要关闭socket就行,因为socket关闭会自动关闭里面的字节流. 另外,接收方在read处会阻塞,直到发送方发送数据/结束通信.

互相通信

f0ab214b87dd0cc5b10eac0d3e417f09_MD5 这样写是不对的,因为接收方read处会阻塞.我们需要发送端在发完后给出一个结束标记. a1f5a51985abb4ed11fddc8949ae81a9_MD5 事实上,经常会在发完后关shutdownOutput.

多线程传输

手动创建线程

只需要修改server.创建类: 62d387b51ac99439463363948468ebbe_MD5 c8dd392cb78e5716472505e8b7ea485b_MD5 主程序: 3ef4206aafef02d30513f303ca69cc03_MD5

线程池

ab435726d9bd47a196a03c82e7085a31_MD5