黑马程序员:JAVA网络编程

------- android培训java培训、期待与您交流! ----------

1、URL

定义:URL(Uniform Resource Locater)是统一资源定位器的简称, URL的值表示网络上某个资源(如打印机、文件)的地址,因此只要按URL规则定义某个资源,那么网络上的其他程序就可以通过URL来访问它。

构成:URL用来网络资源定位,它的值由5部分组成,格式如下:
<传输协议>://<主机名>:<端口号>/<文件名> #<引用>

URL的组成如下:
使用的协议protocol (http, ftp, file…)
资源位置
主机名hostname (即域名,也可使用IP地址)
端口号port ,标识一个特定的服务。用于区 分同一台主机上进行通讯的不同应用进程(www服务端口默认为80)
文件名filename ,一般为路径加上文件名
引用reference ,指向资源文件的某一个位置

说明:
http://java.sun.com就相等同于 http://java.sun.com/index.html。
引用(reference)为资源内的某个引用,用来定位显示文件内容的位置,如http://java.sun.com/index.html#chapter1。例:URL引用示例.html
并非所有的URL都包含这些元素。对于多数的协议,主机名和文件名是必需的,但端口号和文件内部的引用则是可选的。

2、URL类
URL类中定义了许多简单实用的方法,利用它们可以进行一些有关URL的操作。




3、通过URL获取网络信息与资源
一个URL对象生成后,其属性是不能被改变的,但是我们可以通过类URL所提供的方法来获取这些属性。
//实例1:获取网络站点的属性信息

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;


public class NetworkInfo {

    public static void main(String[] args) throws IOException {

URL url = null;

try {
    url =  new URL("http://127.0.0.1:8080/index.jsp");    
} catch (MalformedURLException e) {    
    e.printStackTrace();
}

System.out.println("Protocol:" + url.getProtocol());
System.out.println("HostName:" + url.getHost());
System.out.println("PortNumber:" + url.getPort());
System.out.println("FileName:" + url.getFile());
System.out.println("Reference:" + url.getRef());

    }

}

4、URLConnection

实际应用中,只能读取数据是不够的,很多情况下,我们都需要将一些信息发送到服务器中去,这就要求我们能够实现同网络资源的双向通信,URLConnection类就是用来解决这一问题的。
类URLConnection也是定义在包java.net里,它表示Java程序和URL在网络上的通信连接。当与一个URL建立连接时,首先要在一个URL对象上通过方法openConnection()生成对应的URLConnection对象。URLConnection是以HTTP协议为中心的类,其中很多方法只有在处理HTTP的URL时才起作用。
抽象类 URLConnection 是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL 的连接需要几个步骤:
1) 通过在 URL 上调用 openConnection 方法创建连接对象。
2) 操作设置参数和一般请求属性。
3) 使用 connect 方法建立到远程对象的实际连接。
4) 远程对象变为可用。远程对象的头字段和内容变为可访问。


    1.建立连接
URL url=new URL(“http://www.yahoo.com/”);
URLConnection con=url.openConnection();
    2. 向服务器端送数据
PrintStream ps=
new PrintStream(con.getOutputStream());
ps.println(string_data);
    3. 从服务器读数据
DataInputStream dis=
new DataInputStream(con.getInputStream());
dis.readLine();

5、Socket编程
    1)Socket通信的一般结构
//例1:显示本机IP地址
import java.net.*;

class LocalIP {
    public static void main(String[] args) {
InetAddress ip = null;
try {
    ip = InetAddress.getLocalHost();//获取IP地址对象
} catch (UnknownHostException e) {
}
System.out.println(ip.getHostAddress());//显示IP地址
System.out.println(ip.getHostName());//显示主机名
    }
}

//例2:根据主机名称,显示对应的IP地址。
import java.net.*;
import java.util.Scanner;


public class NetTool {
   
    //从命令行读取主机名称
    public static String readline() throws Exception {
	System.out.print("请输入主机名:");
	Scanner reader = new Scanner(System.in);
	String s = reader.nextLine();
	return s;
    }

    //输出主机信息
    public static void printHostMeg(InetAddress ip) {
	System.out.println("HostName: " + ip.getHostName());
	System.out.println("HostAddress: " + ip.getHostAddress());
	System.out.println("Host: " + ip);
    }

    public static void main(String[] args) throws Exception {
	
	String s = readline();//从命令行读取主机名称
	
	try {
	    InetAddress ip = InetAddress.getByName(s); // 获取InetAddress对象
	    
	    printHostMeg(ip); // 显示主机信息
	    
	} catch (UnknownHostException e) {
	    System.err.println("名称有误或者网络不通!");
	}
    }
}

Socket中文译名是“套接字”,由主机号、端口号和协议名三部分主要内容组成。
Socket是TCP/IP协议的编程接口,一个Socket由一个IP地址和一个端口号唯一确定。
Socket有两种模式:流套接字(stream socket)和数据报套接字(datagram socket)。
流套接字提供了面向连接的网络服务,采用TCP协议;数据报套接字则采用无连接的UDP协议。

java.net包中提供了支持流套接字开发的ServerSocket与Socket类;支持数据报套接字开发的DatagramSocket类和DatagramPacket类。
 
     2)TCP Socket编程

/*服务端程序分析:服务端在6666端口监听客户端的连接请求,
与客户端建立连接后,显示出当前连接数及客户端的IP地址,
接收、显示客户端发送的消息,并向客户端回送消息。*/

import java.net.*;
import java.io.*;

public class EchoServer {
    static int num = 0;

    public static void main(String[] args) throws Exception {

ServerSocket ss = new ServerSocket(6666);
System.out.println("Server Running");
while (true) {
    EchoServer.num++;
    Socket client = ss.accept();
    String cno = "Connection " + num;
    System.out.println(cno + " from: " + client.getInetAddress());
    
    DataInputStream in = new DataInputStream(client.getInputStream());
    DataOutputStream out = new DataOutputStream(client.getOutputStream());
    
    
    //为了防止乱码,一般在发送端用writeUTF方法写,接收端用readUTF方法读。
    String s = in.readUTF();//读取UTF格式的字符串
    System.out.println(cno + " say:" + s);
    out.writeUTF("You are welcome~~~~");//写UTF格式的字符串
    System.out.println("Welcome OK!");

    out.close();
    client.close();
}
    }
}

/*客户端程序分析:客户端连接服务器后,向服务端发送一条消息,
 * 并接收、显示服务端回送的消息。*/
import java.io.*;
import java.net.*;

public class EchoClient {
    public static void main(String[] args) throws Exception {
	Socket s = new Socket("127.0.0.1", 6666);
	
	DataOutputStream out = new DataOutputStream(s.getOutputStream());	
	out.writeUTF("I am coming");
	
	DataInputStream in = new DataInputStream(s.getInputStream());
	System.out.println(in.readUTF());
	s.close();
    }
}

    3)UDP Socket编程

/*服务端程序分析:服务端在6000端口监听客户端的请求,
接收、显示客户端发送的消息,并向客户端回送消息。*/

import java.net.*;
import java.io.*;

public class EchoServer {   

    public static void main(String[] args) throws Exception {

try {
    DatagramSocket ds = new DatagramSocket(6000);//1 创建数据报套接字
    
    byte[] buf = new byte[100];
    DatagramPacket dp = new DatagramPacket(buf, 100);//2 建立接收数据的UDP包 
    
    ds.receive(dp);//3 接收信息UDP包     
    System.out.println(new String(buf, 0, dp.getLength()));
    
     //4 发送信息UDP包 
    String str = "Welcome you!";
    DatagramPacket dpSend = new DatagramPacket(str.getBytes(), 
           str.length(), 
           dp.getAddress(), 
           dp.getPort());
    ds.send(dpSend);
    
    ds.close();//5 关闭数据报套接字
    
} catch (Exception ex) {
    ex.printStackTrace();
}
    }
}

/*客户端程序分析:客户端连接服务器后,向服务端发送一条消息,
 * 并接收、显示服务端回送的消息。*/
import java.io.*;
import java.net.*;

public class EchoClient {
    public static void main(String[] args) throws Exception {
	try {
	    DatagramSocket ds = new DatagramSocket();//1 创建一个数据报套接字
	    
	    String str = "Hello,this is zhangsan";
	    DatagramPacket dp = new DatagramPacket(str.getBytes(),
		    				   str.length(), 
		    				   InetAddress.getByName("localhost"),
		    				   6000);//2 建立要发送的UDP包
	    ds.send(dp); //3 发送UDP包
	    
	    //4 接收UDP包
	    byte[] buf = new byte[100];
	    DatagramPacket dpRecv = new DatagramPacket(buf, 100);
	    ds.receive(dpRecv);  
	    
	    System.out.println(new String(buf, 0, dpRecv.getLength()));
	    ds.close();//5 关闭数据报套接字
	    
	} catch (Exception ex) {
	    ex.printStackTrace();
	}
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值