相对于C和C++来说,Java中的socket编程是比较简单的,比较多的细节都已经被封装好了,每次创建socket连接只需要知道地址和端口即可。
在了解socket编程之前,我们先来了解一下读写数据的数据流类中一些需要注意的东西。
BufferedReader与DataInputStream的区别:
通常我们常用到的字节输入输出流有BufferedReader与PrintWriter,DataInputStream和DataOutputStream这两对。这些类都属于java.io包。
那么两者之间有什么区别呢?
区别就是前者有个缓冲区,假如我们人为设置为100k(不设置亦可,有默认值),,当这个缓冲区存储的内容达到100k的时候,类对象才会进行读入或写入操作。
而Stream的两个对象是没有缓冲区的,它们是收到什么数据就即刻进行读出和写入。
所以在进行socket编程的时候,这两对最好不要交替使用,因为当有数据存到前面提到的缓存里的时候,stream对象没有办法读到缓存里的东西,所以会造成数据的丢失。
在这里我们另外说一说PrintWriter类,先看看比较常用的两个构造方法:
在第二个构造方法中,参数2指明该对象是否自动将缓冲区里的数据流自动刷出,一般来说我们可以采用第二种构造方法,将参数2设为true。
否则,在每次用PrintWriter对象调用printXXX方法的时候,后面就要紧接着使用flush方法。
比如:
PrintWriter pw = new PrintWriter(socket.getOutputStream);
pw.println(“写出数据”);
pw.flush();
如果你不这么做的话,pw对象可能会因为你要写出的数据并未到达缓冲区指定大小而不作任何操作。这个时候你的线程就会阻塞!!所以关于这一点务必小心。
Java里的Socket工作模式:
在socket编程中我们基本上需要用到这些类:
SocketServer、Socket、BufferedReader与PrintWriter(或者DataInputStream与DataOutputStream)。
在服务器中,首先新建一个服务器socket对象:
ServerSocket srvSocket = new ServerSocket(nPort);生命不息,奋斗不止,就像我们常说的一句话;