深刻的了解了网络编程的一些知识点
socket:套接字
ServerSocket 用来声明服务器
Socket用来声明客户端,其实也不然,在serversocket的accept的方法中,返回的是一个socket变量。我觉得更像一个接口,网络接口。
InternetAddress可以用来获得IP地址,用它的getAddress方法,getbyName方法可以指定ip地址。
文件流
文件流比较多,字节流,字符流,通常网络编程使用较为多的是InputStream,OutputStream,对象流:ObjectOutputStream和ObjectInputStream,缓冲流:BufferOutputSream和BufferInputStream。
有一个专门为udp的包来发送,但是udp是不可靠连接,即使你没开服务器,也可以发出,因为它只管发出,不会管有没有到
在这几天的修改代码中遇到了很多问题。
一.传输的时候出现沾包问题
解决方案:
1.可以指定数据长度,然后去读写,但是这种方法效率低下
2.可以插入特定字符,读取的时候注意即可,个人认为回车符号是很可以的。
二.传输的时候都卡在一个点阻塞了
解决方案
1.可以利用flush去强制把流中的数据弹出。(shutdown不可以,shutdown使用的话会关闭流,也相当于关闭了通道)
三.如果一个对象当中设置了serversocket和socket,多次new对象,不是多线程的情况,会出现connection reset的情况。
解决方案
尽量在一个对象中进行操作
序列化
序列化:将 Java 对象转换成字节流的过程。
反序列化:将字节流转换成 Java 对象的过程。
当 Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。
实现类实现Seriailizable 接口,读取的时候需要按照写入的顺序来。
提示,不要写过多的端口实现功能,很容易眼花缭乱,导致出错。
虽然踩了这么多坑,但是至今连上去的只有登录,并且还有点小bug在里面。
现在客户端和服务端还没分离出来,因为我的消息总是阻塞,尽管我使用了flush,各种流也试过了。只要消息传输次数多了,就容易阻塞。还没有找到原因,想试试对象流,以及序列化操作是否能解决该问题。
下面的这个账号和密码我是分了俩次发送
客户端
服务端