最近在研究Java网络编程,将自己的心得记录下来,方便自己和大家,汤姆涛要加油~~
以实例为基础,尝试设计一个能够接受网络数据的程序,采用TCP与特定的计算机端口相连,从而接收数据。
利用的库为用于IO的java.io,用于网络编程的java.net,定义一个ReadNet类。
思路:
用InputStream对象接收数据,根据指定的端口生成socket,用循环读取数据,读取完毕后关闭连接,注意每步的异常处理
代码如下:
import java.io.*;
import java.net.*;
public class javanet {
public static void main(String[] args) {
byte[] buff = new byte[1024];
Socket readsocket = null;//连接服务器的socket
InputStream instr = null;//读取数据对象
boolean cont = true;
//对指定的端口,生成socket
//生成instr对象,准备读取数据
try
{
readsocket = new Socket(args[0], Integer.parseInt(args[1]));
instr = readsocket.getInputStream();
}
catch(Exception e){
System.err.println("can't find file");
System.exit(1);
}
//数据读取,通过循环完成,这是文件IO时常用的手法
while(cont)
{
try{
int n = instr.read(buff);
System.out.write(buff,0,n);
}
catch(Exception e){
cont = false; //读取完时,cont变为false
}
}
//完成操作后关闭连接
try{
instr.close();
}
catch(Exception e){
System.err.println("net error");
System.exit(1);
}
}
}
注意:运行该程序要传入两个参数,一个是服务器地址此处是args[0],另一个是端口号,此处是args[1]。
该程序能够建立与服务器的联系,因此称为网络客户端程序,要真正实现数据的读取,还必须在服务器运行一个程序响应客户端的连接请求,在接受请求后想客户端发送连接时间信息。该程序在以后给出,假设为netclock。
运行Readnet的计算机要和运行netclock的程序网络连接,当然,同一台计算机也可以运行,启动两个Dos命令窗口分别运行即可,但是不利于验证网络功能了。
另外,在java语言中,从键盘或文件中读取数据与从网络端口中读取数据可以采用极为相似的方法处理,因此我们得到启示
java语言对键盘,屏幕,文件和网络上所有设备的读取可以采用近似相同的方法处理。
生成socket的方法很多,在此程序中,采用传递DNS名指定主机和端口号两个参数的方法生成socket。