Kagula
2009-11-23
Java Socket DataInputStream DataOutputStream
使用Java同步IO应用程序库,实现CS结构网络编程。
使用Socket来建立网络连接,使用DataInputStream、DataOutputStream来存取网络流。
第一步:建立网络连接对象,和网络流输入输出对象
Socket c = new Socket(InetAddress.getByName("192.168.0.144"),6009);
dis = new DataInputStream(c.getInputStream());
dos = new DataOutputStream(c.getOutputStream());
第二步:读写网络流
写字符串用下面的代码
dos.writeUTF(list.get(i).toString());
dos.flush();
写二进制数据采用下面的代码
//byte[] b = new byte[nnL];
dos.write(b,0,nnL);
dos.flush();
这里要注意的是write函数的第二个参数,指的是缓存区起始位置,nnL指的是缓存区中数据的长度。b缓存的大小建议为1KB,过大会导致部份数据发送出去了,但是接收到没有收到有效的数据。
读字符串用下面的代码
String sR = dis.readUTF();
读二进制数据用下面的代码
Dis.read(b,0,nnL);
这里需要注意,发送端同接收端之间,网络流存取函数要匹配,数据长度也要匹配,否则会阻塞。
第三步:关闭连接。代码如下
Dis.close();
Dos.close();
C.close();
第一步:建立ServerSocket对象,得到客户端的连接请求,代码如下:
ServerSocket server = new ServerSocket(listenPort);
Socket incomingConnection = null;
while(true) {
incomingConnection = server.accept();
incomingConnection.setSoTimeout(9*60*1000);
handleConnection(incomingConnection);
}
其中,listenPort是侦听端口为整型。客户同发送请求后,服务端和客户端建立连接,server.accept返回socket。
利用socket,得到读写网络流数据的对象,其它同客户端的编程方式。在完成读写后你也需要调用socket实例的close函数,断开同客户端的连接。Socket实例的setSoTimeout设置,保证在九秒后自动关闭同客户端的连接。
相比C++,Java提供的API非常容易使用。但是也要注意几个问题。[1]服务端和客户端的读写函数必须要匹配。[2]服务端同客户端之间读写的数据长度要一致。[3]读写缓存不能过多,否则将导致发送出去的数据无效。
在第三个问题上,可是费了一个工作日才找到原因。