10.1 java网络编程基础
10.1.1 IP地址和InetAddress类
1、TCP/IP协议和IP地址
TCP是一种传输控制协议,IP是一种网际协议。
TCP/IP分为4个层次:网络接口层,负责接受和发送物理帧;网络层,负责相邻节点之间的通信;传输层,负责起点到终点的通信;应用层,提供诸如文件传输、电子邮件等应用程序。
2、InetAddress类
java.net包这你哦个有InetAddress类的定义,InetAddress类的对象用于存储IP地址和域名,该类提供以下方法:
(1)getByName(String s),获得一个InetAddress对象,含有主机的IP地址和域名。
(2)String getHostName(),获取InetAddress对象的域名。
(3)String getHostAddress(),获取InetAddress对象的IP地址。
(4)getLocalHost(),获得一个InetAddress对象,包含本地机的域名和IP地址。
10.1.2 同一资源定位符URL
是www客户机访问Internet时用来标识资源的名字和地址的。URL的格式是:
<METHOD>://<HOSTNAME:PORT>/<PATH>/<FILE>
其中METHOD是传输协议;HOSTNAME是文档和服务器所在Internet主机名;PORT是服务端口号;PATH是路径名;FILE是文件名。
1、URL类
java.net包中有URL类,利用URL对象能实现Internet寻址、网络资源的定位连接,在客户机与服务器之间直接访问等。
2、URLConnection类
要接收和发送信息还需要用URLConnection类,程序获得一个URLConnection对象,相当于完成对指定URL的一个HTTP连接。例如
URL mu=new URL("http://www.sun.com");//先要创建一个URL对象
URLConnection muc=mu.openConnection();//获得URLConnection对象
3、信息的发送与接收
发送和接收信息要获得流对象,并由流对象创建输入或输出数据流对象。然后就可以用流的方法访问网上资源。
例如,下面是以数据流方式读取网页内容的应用程序。
- import java.net.*;
- import java.awt.*;
- import java.awt.event.*;
- import java.io.*;
- import javax.swing.*;
- public class Example{
- public static void main(String args[]){
- new DownNetFile();
- }
- }
- class DownNetFile extends JFrame implements ActionListener{
- JTextFiled inFiled = new JTextFiled(30);
- JTextArea showArea = new JTextArea();
- JButton b = new JButton("下载");
- JPanel p =new JPanel();
- DownNetFile(){
- super("读取网络文本文件示意程序");
- Container con = this.getContentPane();
- p.add(inFiled);
- p.add(b);
- JScrollPane jsp=new JscrollPane(showArea);
- b.addActionListener(this);
- con.add(p,"North");
- con.add(p,"Center");
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- setSize(500,400);
- setVisible(true);
- }
- public void actionPerformed(ActionEvent e){
- readByURL(inFiled.getText());
- }
- public void readByURL(String urlName){
- try{
- URL url = new URL(urlName);
- URLConnection tc = url.openConnection();
- tc.connect();
- InputStreamReader in = new InputStreamReader(tc.getInputStream());
- BufferedReader dis = new BufferedReader(in);
- String inLine;
- while((inLine = dis.readLine())!=null){
- showArea.append(inLine + "/n");
- }
- dis.close();
- }catch(MalformedURLException e1){
- }catch(IOException e2){
- }
- }
- }
10.1.3 客户机/服务器模式
网络应用模式主要有:主机/终端模式、集中计算、集中管理;客户机/服务器模式、分布计算、分布管理;浏览器/服务器模式。
在客户机/服务器模式中,在server端,要准备接收多个client端计算机的通信。为此,除用IP地址标识Internet上的计算机外,另还引入端口号,用端口号标识正在server端后台服务的线程。端口号与IP地址的组合成为网络套接字socket。
java语言在实现c/s模式中,套接字分为两个类:在server端,ServerSocket类支持底层的网络通信;在client端,Socket类至此回网络底层通信。server机通过端口提供面向client机的服务;server机在它的几个不同端口分别同时提供几种不同的服务。client接入server的某一端口,通过这个端口提请server机为其服务。规定:端口号0~1023供系统专用。端口号1024~65535供应用程序使用。
双方实现通信有流式socket和数据报式socket两种。
流式socket是有连接的通信,即tcp。每次通信钱建立连接,通信结束后断开连接。特点是可以保证传输的正确性、可靠性。
数据报式socket是无连接的通信,即udp,将欲传输的数据分成小包,直接上网发送。无需建立连接和拆除连接,速度快,但无可靠保证。
流式socket在client程序和server程序间建立连接通信的通道。每个socket可以进行读写两种操作。对任一端,与对方的通信会话过程是:建立socket连接,获得输入/输出流,读数据/写数据,通信完成后关闭socket。
利用Socket的构造方法,可以在客户端建立到服务器的套接字对象爱:Scoket mySocket = new Socket("http://fudan.ecu.cn",1860);
然后,用getInputStream方法获得输入流,用这个输入流读取服务器放入“线路”的信息;用getOutputStream方法获得输出流,用这个流将信息写入“线路”。
利用ServerSocket构造方法,可以在服务器端建立接收客户端套接字的服务器套接字对象:ServerSocket(int port),指定端口号,创建一个ServerSocket对象,端口号要和客户端呼叫的款口号相同。
服务器端程序在指定的端口监听,当收到Client陈旭发出的服务请求时,创建一个套接字对象与该端口对应的Client程序通信。
例如,
- public class Client{
- public static void main(String args[]){
- String s=null;
- Scoket myScoket;
- DataInputStream in = null;
- DataOutputStream out = null;
- try{
- myScoket = new Scoket("localhost",4441);
- in = new DataOutputStream(myScoket.getInputStream());
- out = new DataOutputStream(myScoket.getOutputStream());
- out.writeUTF("server,hello");
- while(true){
- s = in.readUTF();
- if(s==null){
- break;
- }else {
- System.out.println(s);
- }
- }
- mySocket.close();
- }catch(IOException e){
- }
- }
- }
- public class Server{
- ServerSocket server = null;
- Socket you =null;
- String s = null;
- DataInputStream in = null;
- DataOutputStream out = null;
- try{
- server = new ServerSocket(4441);
- }catch(IOException e){
- }
- try{
- you = server.accept();
- in = new DataInputStream(you.getInputStream());
- out = new DataOutputStream(you.getOutputStream());
- while(true){
- s=in.readUTF();
- if(s!=null) break;
- }
- out.writeUTF("hello,client,I'm a sever");
- out.close()
- }catch(IOException e1){
- }
- }