网络编程
本章设计的零散的概念比较多,所以笔记内容偏向于概念的归纳。
一IP地址和端口:
要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数据的计算机和识别发送数据的计算机,在TCP/IP协议中,这个标识号就是IP地址。目前的IP地址在计算机中4个字节,也就是32位的二进制数表示,称为Ipv4使用16个字节标识IP地址的格式就是Ipv6。IP只能保证把数据送到计算机,不能保证把数据交给哪个网络程序。
有一个称为端口的部分,为一个整数,用于标识该数据帧交给哪个应用程序来处理。端口数范围为0-65535之间。0-1023之间的端口数是用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口数.。
二UDP与TCP
UDP:用户数据报协议(=User Datagram Protocol),是ISO参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
TCP:传输控制协议(=Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的运输层(Transport layer)通信协议。
三Socket机制
Socket是网络驱动层提供给应用程序编程的接口和一种机制。
1、首先,应用程序产生Socket
2、然后,应用程序调用bind方法,将Socket的信息传递给驱动程序
3、之后,驱动程序根据从网卡读取到的目标端口号,将数据处理后传送到Socket中。
4、最后,引用程序从Socket中接收数据。
个人理解,Socket像是邮递员手中的快点袋一样,可以预先没有发件人信息,但必须要有收件人的信息和地址。
四、Java提供的网络通信类
DatagramSocket类,用于UDP通信。
ServerSocket类,用于TCP通信的服务器端(TCP通信分为客户端和服务器端),是指接收客户端连接的Socket。
Socket类,用于TCP通信的服务器端和客户端,是指为建立服务器与客户端连接的Socket。
DatagramSocket类:
五、UDP网络程序编写是需用到的类及方法:
DatagramSocket类
public DatagramSocket():未指定Port和IP地址,若UDP程序不用事先接收对方发送的数据,而是主动的先给对方发送数据,则最后使用这种方式。
public DatagramSocket(int port):若UDP程序有可能要先接收对方先发来的数据,则该UDP程序就必须选择这个构造函数来创建Socket。由程序自己指定端口号,而不是由系统来分配。否则,我们就不能在UDP程序运行前知道该程序所使用的端口号,并且程序每一次运行时所分配到的端口号是不一样的。
send(DatagramPacket p):该方法用于发送UDP数据包,
receive(DatagramPacket p):该方法用于接收UDP的数据包。
DatagramPacket类:若DatagramSocket类对象是收发数据的码头,则DatagramPacket类对象就是收发数据的一个个的集装箱。指定了数据包的缓冲区和长度。相当于定义了集装箱的大小
DatagramPacket类提供了getInetAddress()方法和getPort()方法:
使用getInetAddress()方法和getPort()方法可以得到目的地的IP和Port。
InetAddress类:InetAddress是用于表示计算机IP地址的一个类,在日常应用中使用的是4个字节的整数字符串表示的。
六、基本UDP程序的编写过程:
1、编写发送程序:创建DatagramSocket 类对象,指定数据包的内容、内存空间和大小,发送的端口;将发送数据的字符串转换为byte型数组,借助DatagramSocket 类对象的send方法发送出去;
2、编写接收程序,创建DatagramSocket 类对象,指定接收哪个端口上的数据,借助DatagramSocket 类对象的receive方法接收数据,将字符数组转换为字符串。。
注意:
接收发送数据操作完成后要记得释放系统资源;
UDP接收程序必须先启动,才能接收UDP发送程序发送的数据:
在指定发送数据包的过程中,应按字节数组的大小来计算,而不是字符串中字符的个数;
七、用Java编写TCP网络程序
利用UDP通信的发送接收程序是平等的,没有主次执法;而利用TCP协议进行通信的两个应用程序是有主次之分的,一个为服务器端程序,另一个是客户端程序。
java中提供的ServerSocket类用于完成类似114查号台总机的功能,Socket类用于完成普通电话和114查号台端的座机功能,这样其交互过程为:
1、 服务器程序创建一个ServerSocket,然后调用accept方法等等客户来连接。
2、 客户端程序创建一个Socket,并请求与服务器建立连接。
3、 服务器接收客户请求,并创建一个新的Socket与该客户建立专线连接。
4、 刚创建的两个Socket在服务器程序创建的一个单独线程中对话,处理客户请求;
5、 服务器开始等待新的连接请求。
八、简单的TCP服务器程序。
SeverSocket ss = new ServerSocket(8001);
Socket s = ss.accept();
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
ops.write("welcome to www.it315.org",getBytes());
byte [] buf = new buyte [1024];
int len = ips.read(buf);
System.out.println(new String(buf,0,len));
ips.close();
ops.close();
s.close();
ss.close();
服务器程序从与客户建立了连接的Socket对象中获得输入输出流对象,通过输出流先向客户端发送一串字符,然后通过输入流读取客户发送过来的信息,并将这些信息保存到一个字节数组中,然后关闭所有的系统资源。
验证服务器程序能否正常工作,可以用Windows自带的telnet程序。验证可知,输入一个字符后,程序马上就发出去,不等后面按下回车结束,无法整行发送数据。需借助BufferedReader类的readline方法实现按行发送数据的功能;
将以下代码:
byte [] buf = new buyte [1024];
int len = ips.read(buf);
System.out.println(new String(buf,0,len));
替换为:
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
System.out.println(br.readLine());
这样,就可以接受整行数据了,如果要接收多个客户的连接请求,我们就可以在以上程序基础上,将accept方法放在循环里面就可以实现了。
九、简单的TCP客户端程序
if (args.length < 2) {
System.out.println("Usage:java TcpClient ServerIP ServerPort");
return;
}
Socket s = new Socket(InetAddress.getByName(args[0]),Integer.parseInt(args[1]));
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
DataOutputStream dos = new DataOutputStream(ops);
BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));
while (true) {
String strWord = brKey.readLine();
dos.writeBytes(strWord + System.getProperty("line.separator"));
if (strWord.equalsIgnoreCase("quit"))
break;
else
System.out.println(brNet.readLine());
}
System.out.println("here");
dos.close();
brNet.close();
brKey.close();
s.close();
以上为主要的程序代码,程序中先对输入参数进行判断,没有参数输入就退出;有输入参数,就先对输入流进行缓冲包装,然后对读取到的内容进行判断,对非“quit”内容再进行输出显示。
其中用参数来指定了运行程序时的IP地址和端口号,这样让我们的程序更灵活通用。
十、其他补充:
各种网络应用协议(ftp、smtp、pop3、http等)是TCP上跑的车,它们可以选择在TCP这条路上跑,也可以不在这条路上跑,而是到其他路上跑。
对UDP和TCP的个人理解:
UDP和TCP程序的编写虽然在功能写法上差别很大,但是主体上的编程思想和运行是类似的,唯一不同的就是UDP只管发,不管收没收到,犹如对讲机的工作情况;TCP可以实现发送方和接收方的对话互动,就像打电话一样。