一.UDP
1.UDP发送数据
2.UDP接收数据
bys若直接转换成String进行输出,若发送的数据没占满数组那么大则会输出一堆空字符串
二.TCP
1.TCP发送数据
Socket 里直接用IP地址,这个构造函数底层会自动用InetAddress进行封装
OutStream 这个抽象类是所有字节输出流的超类
InputStream 这个抽象类是所有字节输入流的超类
这边是发送端,用输出流的原因是相当于把数据给输出到接收端的屏幕上 所以用输出流
接收端相当于接收到从客户端发来的数据 类似于从文件中读取文件 是输入流
2.TCP接收数据
3.案例
下面案例展示了一个用BufferedReader BuffererWriter来封装 字节输入流的的方法这样的话就可以直接一次读取一个字符串,而不是读字节数组
BufferedReader BufferedWriter 有两种读取数据方法 1>byte[] 2>String 肯定直接读取String 的方法方便,而字节流的所有方法和字符流的其他方法
只能通过Byte数组 和单个字节读入 ,太麻烦 ,所以这里把InputStream用转换流封装成字符缓冲流,所以推荐用这个
InputStreamReader和 OutputStreamWriter相当于转换流分别用于 将字节输入流转换成字符流 和 将字节流输出转换成字符输出流
BufferedReader 和 BufferedWriter相当于 BufferedReader :从字节流或文本读入转换成字符流 BufferedWriter :将字节流入写入字符输出流参数为字节流或文本
在网络中s.getInputStream接收到的是字节流 s.getOutputStream也是字节流 ,不想以字节形式输入和输出说以用BufferedReader 和 BufferedWriter封装一次读取一个字符串
所以以后写文本文件在网络中传输 就最好用 BufferedReader BufferedWriter 封装
1>客户端向服务器发送数据,服务器给出反馈
ServerSocket的资源释放后 Socket Os Is 也自动释放了
2>客户端向服务器发消息,到886结束
而这里又为了以String类型读取数据而不以byte[],所以需要用到 InputStreamReader和 OutputStreamWriter BufferedReader BufferedWriter
3>客户端向服务器发送数据,服务器存入文本中
3>数据从文本文件读取发送到服务器
4>
这里遇到的问题就是客户端已经从文本中读完文件并发送完,但是服务器并不知道客户端发送完了,还在一直等待客户端发送,客户端也在等待服务器反馈,
就导致了死锁,所以用这个类提高的shutdownOutput来终止
5>