- 浏览: 203319 次
- 性别:
- 来自: 湖南
文章分类
最新评论
网络编程
网络编程的基础知识
网络协议与TCP/IP 计算机之间的连接协议规则
IP地址和Port(端口号) 本地回路的IP地址:127.0.0.1
端口号的范围为0~65535之间,0~1024之间的端口数是用于一些知名的网络服务和应用。
UDP与TCP
TCP,传输控制协议是面向连接的通信协议
UDP,用于数据协议,是无连接通信协议
TCP、UDP的数据帧格式简单图例:(其中协议类型用区UDP与TCP)
协议类型 源IP 目录IP 源端口 目录端口 帧序号 帧数据
Socket
Socket 是网络驱动层提供给应用程序编程的接口和一种机制
可以把Socket比喻成一个港头码头,应用程序只要把货物放到港口码头,就算完成
货物的运送,应用程序只需等待货物到达码头
java中的网络编程类
位于java.net包中
DatagramSocket类用于UDP通信
ServerSocket类用于TCP通信的服务器端
Socket类 此类实现客户端套接字,套接字是两台机器间通信的端点
UDP网络程序
DatagrmeSocket类
构造函数:
DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。
close() 关闭此数据报套接字
send(DatagramPacket p) 从此套接字发送数据报包。
receive(DatagramPacket p) 从此套接字接收数据报包。
DatagramPacket类
如果把DatagramSocket比作创建的港口码头,那么DatagramPacket就是发送和接收数据的集装箱
构造函数:
DatagramPacket(byte[] buf, int length) 构造 DatagramPacket,用来接收长度为 length 的数据包
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
方法:getPort() 返回某台远程主机的端口号、getAddress()返回某台机器的 IP 地址
getData()返回数据缓冲区、getLength() 返回将要发送或接收到的数据的长度
例1:
例2:
UDP网络聊天程序
(只有UDP才能发送广播地址)
TCP 网络程序
TCP 网络程序的工作原理
TCP客户端程序与TCP报务器端程序的交互过程:
(1)服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接.
(2)客户端程序创建一个Socket并请求与服务器建立连接。
(3)服务器接收客户的连接请求,并创建一个新的Socket与该客户建立专线连接
(4)建立了连接的两个Socket在一个单独的线程(由服务器程序创建)上对话.
(5)服务器开始等待新的连接请求,当新的连接请求到达时,重复步骤(2)到步骤(5)的过程。
ServerSocket
ServerSocket() 创建非绑定服务器套接字。
ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
ServerSocket(int port, int backlog) 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
ServerSocket(int port, int backlog, InetAddress bindAddr) 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。
close() 关闭此套接字。
accept() 侦听并接受到此套接字的连接。
Socket
Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字
Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程地址上的指定远程端口。
Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket(String host, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程主机上的指定远程端口。
getInputStream() 返回此套接字的输入流。
getOutputStream() 返回此套接字的输出流。
简单的TCP服务程序
1。TCP服务程序必须先启动运行,TCP客户机程序才能连接上TCP报务器程序。
2。使用Windows提供的telnet程序测试TCP服务器程序。
3。使用BufferedReader包装类,从网络输入流中一次读取一行文本。
4。如何打开telnet程序的本地回显功能。
windows DOS窗口输入telnet 地址 端口 (测试)
实例1
实例2 TCP网络聊天程序
实例3 (服务与多个客户端会话)
如何检测和解决端口冲突问题
1、使用netstat命令查看当前正在被使用的TCP端口号。(netstat -na)
2、通过一个配制参数来指定TCP服务程序所使用的端口。
3、将用户指定的端口号保存到一个文件中,当服务器程序下次启动运行时,直接从文件中读取那个端口号。
TCP客户端程序
在TCP网络连接上传递对象
1、ObjectInputStream和ObjectOutputStream可以从底层输入流中读取对象类型的数据和将对象数据写入到底层输出流。
2、ObjectInputstream和ObjectOutputstream来包装底层网络字节流,TCP服务器和TCP客户端之间就可以传递对象类型的数据。
3、编程实例:(通过网络传输Java对象)
访问Internet网络资源
java.net包中还有URL、URLDecoder、URLEncoder、URLConnection、HttpURLConnection等类。
URL(Uniform Resure Locator统一资源定位符)
1、URL的基本组成:协议、主机名、端口号、资源名。
2、URL编码规则:
将空格转换为加号(+)。
对0~9,a~z,A~Z之间的字符保持不变。
对于所其它的字符,有这个字符的当前字符集编码在内存中的十六进制
格式表示,并在每个字节前加上一个百分号(%)。如字符“+”用%2B表示
,字符“=”用%3D表示,字符“&”用%26表示,每个中文字符在内存中占两个
字节,字符“中”用%D6%D0表示,字符“国”用%B9%FA表示。
3、java.net包中提供了URLEncoder和URLecoder这两个类,来实现URL编码和解码。
HTTP协议
TTTP协议的会话过程
基于HTTP 1.0协议的客户机与服务器的信息交换过程(客户机--建立连接--发送请求信息——》服务器--发出响应信息--关闭连接--》客户机);
基于HTTP 1.1协议的客户机与服务器的信息交换过程(客户机--建立连接--发出第1~n次连接-》服务器--发出第1~n次连接--关闭连接--》客户机);
HTTP请求消息 一个完整的请求消息包括:一个请求行、若干消息头、以及实体内容。
一个完整的响应消息包括:一个状态行、若干消息头、以及体内容。
几个HTTP消息头
1、Connection 用于指定处理完本次请求/响应后,客户端与服务器是否继续保持连接,设置值可以为keep-Alive和close.
2、Accept-Language 用于指定客户机期望服务器返回的文档所使用的语言,可以指定多个以逗号分隔的国家语言。
3、Content-Length 用于表示实体内容的长度(字节数)。
4、Range 用于指定服务器只需返回文档中的部分内容及内容范围,有以下几种使用格式:
Range:bytes=100-599
Range:bytes=100-
Range:bytes=-100
5、Content-Range 用于指定服务器返回的部分实体内容的位置信息,例如:Content-Range:bytes 2543-4531/7898
telnet www.g.cn 80
GET / HTTP/1.1
Hosst:
Accept-Language: zh-cn
URL类
构造函数(都可能引发MalformedURLException异常):
URL(String spec) 根据 String 表示形式创建 URL 对象。
URL(String protocol, String host, int port, String file) 根据指定 protocol、host、port 号和 file 创建 URL 对象。
URL(String protocol, String host, int port, String file, URLStreamHandler handler) 根据指定的 protocol、host、port 号、file 和 handler 创建 URL 对象。
URL(String protocol, String host, String file) 根据指定的 protocol 名称、host 名称和 file 名称创建 URL。
URL(URL context, String spec) 通过在指定的上下文中对给定的 spec 进行解析创建 URL。
URL(URL context, String spec, URLStreamHandler handler) 通过在指定的上下文中用指定的处理程序对给定的 spec 进行解析来创建 URL。
工厂设计模式
URL类的setURLStreamHandlerFactory(URLStreamHandlerFactory fac)设置应用程序的 URLStreamHandlerFactory。在一个给定的 Java 虚拟机中,此方法最多只能调用一次。
URLStreamHandlerFactory类的createURLStreamHandler(String protocol) 创建具有指定协议的新 URLStreamHandler 实例。
URLConnetion和HttpURLConnetin类
通过在 URL 上调用 openConnection 方法创建连接对象。
处理设置参数和一般请求属性。
使用 connect 方法建立到远程对象的实际连接。
远程对象变为可用。远程对象的头字段和内容变为可访问。
setRequestProperty(String key, String value) 设置一般请求属性。
getHeaderFields() 返回头字段的不可修改的 Map。
getInputStream() 和 getOutputStream() 返回从此打开的连接读取的输入出流
getHeaderField(int n) 返回第 n 个头字段的值。
getHeaderField(String name) 返回指定的头字段的值。
getContentLength() 返回 content-length 头字段的值。
getContentEncoding() 返回 content-encoding 头字段的值。
getContentType() 返回 content-type 头字段的值。
一个HTTP连接可以被多个HttpUPLConnection实例对象共享,调用HttpURLConnection的disconnect方法可以关闭底层共享网络。
实例:
网络编程的基础知识
网络协议与TCP/IP 计算机之间的连接协议规则
IP地址和Port(端口号) 本地回路的IP地址:127.0.0.1
端口号的范围为0~65535之间,0~1024之间的端口数是用于一些知名的网络服务和应用。
UDP与TCP
TCP,传输控制协议是面向连接的通信协议
UDP,用于数据协议,是无连接通信协议
TCP、UDP的数据帧格式简单图例:(其中协议类型用区UDP与TCP)
协议类型 源IP 目录IP 源端口 目录端口 帧序号 帧数据
Socket
Socket 是网络驱动层提供给应用程序编程的接口和一种机制
可以把Socket比喻成一个港头码头,应用程序只要把货物放到港口码头,就算完成
货物的运送,应用程序只需等待货物到达码头
java中的网络编程类
位于java.net包中
DatagramSocket类用于UDP通信
ServerSocket类用于TCP通信的服务器端
Socket类 此类实现客户端套接字,套接字是两台机器间通信的端点
UDP网络程序
DatagrmeSocket类
构造函数:
DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。
DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。
close() 关闭此数据报套接字
send(DatagramPacket p) 从此套接字发送数据报包。
receive(DatagramPacket p) 从此套接字接收数据报包。
DatagramPacket类
如果把DatagramSocket比作创建的港口码头,那么DatagramPacket就是发送和接收数据的集装箱
构造函数:
DatagramPacket(byte[] buf, int length) 构造 DatagramPacket,用来接收长度为 length 的数据包
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号
方法:getPort() 返回某台远程主机的端口号、getAddress()返回某台机器的 IP 地址
getData()返回数据缓冲区、getLength() 返回将要发送或接收到的数据的长度
例1:
package udpSocket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class UDPSend { public static void main(String args[]){ DatagramSocket ds = null; try { ds = new DatagramSocket(); String msg = "Hello good Luck!"; ds.send(new DatagramPacket(msg.getBytes(), msg.length(), InetAddress.getByName("127.0.0.1"), 8888)); ds.close(); } catch (SocketException e) { e.printStackTrace(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
package udpSocket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UDPRecv { public static void main(String args[]){ DatagramSocket ds =null; try { ds=new DatagramSocket(8888); byte buf[] =new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,1024); System.out.println("发送说:"+new String(buf,0,dp.getLength())+ "IP:"+dp.getAddress().getHostAddress()+"端口:"+dp.getPort()); ds.close(); } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
例2:
UDP网络聊天程序
package udpchat; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.List; import java.awt.Panel; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class Chat extends Frame { private static final long serialVersionUID = 1L; private List list = new List(6); private TextField tip = new TextField(15); private TextField tdata = new TextField(20); DatagramSocket ds =null; public Chat(){ this.add(list,"Center"); Panel p = new Panel(); this.add(p,"South"); p.setLayout(new BorderLayout()); p.add(tip,"West"); p.add(tdata,"East"); tip.setText("127.0.0.1"); try { ds = new DatagramSocket(8888); } catch (SocketException e) { e.printStackTrace(); } new Thread(new Runnable() { public void run() { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, 1024); try { while(true){ ds.receive(dp); System.out.println(new String(buf,0,dp.getLength())); list.add(new String(buf,0,dp.getLength())); // list.add(new String(buf,0,buf.length) +" from "+dp.getAddress().getHostAddress()+" : "+dp.getPort(), 0); } } catch (IOException e) { e.printStackTrace(); } } }).start(); tdata.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { try { byte buf[]; buf = tdata.getText().getBytes(); System.out.println(buf.length); ds.send(new DatagramPacket(buf, buf.length, InetAddress.getByName(tip.getText()), 8888)); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } tdata.setText(""); } }); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { dispose(); System.exit(0); } }); } public static void main(String[] args) { Chat chat = new Chat(); chat.setSize(300, 400); chat.setLocation(300, 200); chat.setVisible(true); chat.setResizable(false); } }
(只有UDP才能发送广播地址)
TCP 网络程序
TCP 网络程序的工作原理
TCP客户端程序与TCP报务器端程序的交互过程:
(1)服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接.
(2)客户端程序创建一个Socket并请求与服务器建立连接。
(3)服务器接收客户的连接请求,并创建一个新的Socket与该客户建立专线连接
(4)建立了连接的两个Socket在一个单独的线程(由服务器程序创建)上对话.
(5)服务器开始等待新的连接请求,当新的连接请求到达时,重复步骤(2)到步骤(5)的过程。
ServerSocket
ServerSocket() 创建非绑定服务器套接字。
ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
ServerSocket(int port, int backlog) 利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
ServerSocket(int port, int backlog, InetAddress bindAddr) 使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。
close() 关闭此套接字。
accept() 侦听并接受到此套接字的连接。
Socket
Socket() 通过系统默认类型的 SocketImpl 创建未连接套接字
Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket(InetAddress address, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程地址上的指定远程端口。
Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
Socket(String host, int port, InetAddress localAddr, int localPort) 创建一个套接字并将其连接到指定远程主机上的指定远程端口。
getInputStream() 返回此套接字的输入流。
getOutputStream() 返回此套接字的输出流。
简单的TCP服务程序
1。TCP服务程序必须先启动运行,TCP客户机程序才能连接上TCP报务器程序。
2。使用Windows提供的telnet程序测试TCP服务器程序。
3。使用BufferedReader包装类,从网络输入流中一次读取一行文本。
4。如何打开telnet程序的本地回显功能。
windows DOS窗口输入telnet 地址 端口 (测试)
实例1
package com.cn; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Servers { public static void main(String[] args) { try { ServerSocket s = new ServerSocket(8888); Socket c = s.accept(); InputStream in = c.getInputStream(); OutputStream out = c.getOutputStream(); out.write("welcom to China\t".getBytes()); BufferedReader br=new BufferedReader(new InputStreamReader(in)); System.out.println(br.readLine()); in.close(); out.close(); c.close(); s.close(); } catch (IOException e) { e.printStackTrace(); } } }
实例2 TCP网络聊天程序
package com.cn; import java.awt.BorderLayout; import java.awt.Frame; import java.awt.List; import java.awt.Panel; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; public class TCPChat extends Frame { private static final long serialVersionUID = 1L; private List list = new List(6); private TextField tip = new TextField(15); private TextField tdata = new TextField(20); private ServerSocket ss = null; private Socket socket=null; private Socket client = null; private BufferedReader br; private PrintWriter out; public TCPChat(){ this.add(list,"Center"); Panel p = new Panel(); this.add(p,"South"); p.setLayout(new BorderLayout()); p.add(tip,"West"); p.add(tdata,"East"); tip.setText("127.0.0.1"); try { ss = new ServerSocket(8888); } catch (IOException e) { e.printStackTrace(); } new Thread(new Runnable() { public void run() { while(true){ try { client = ss.accept(); br = new BufferedReader(new InputStreamReader(client .getInputStream())); list.add(br.readLine()); } catch (IOException e) { e.printStackTrace(); } } } }).start(); tdata.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { try { socket=new Socket(tip.getText(),8888); out=new PrintWriter(socket.getOutputStream(),true); out.println(tdata.getText()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } tdata.setText(""); } }); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { dispose(); System.exit(0); } }); } public static void main(String[] args) { TCPChat chat = new TCPChat(); chat.setSize(300, 400); chat.setLocation(300, 200); chat.setVisible(true); chat.setResizable(false); } }
实例3 (服务与多个客户端会话)
package com.cn; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Servers { public static void main(String[] args) { try { ServerSocket s = new ServerSocket(8888); Boolean RUN = true; while(RUN){ Socket c = s.accept(); Thread t =new Thread(new Severlet(c)); t.start(); } s.close(); } catch (IOException e) { e.printStackTrace(); } } }
package com.cn; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; public class Severlet implements Runnable { private Socket c; public Severlet(Socket c){ this.c = c; } public void run() { try { InputStream in = c.getInputStream(); OutputStream out = c.getOutputStream(); BufferedReader br =new BufferedReader(new InputStreamReader(in)); PrintWriter p =new PrintWriter(out,true); while(true){ String strLine = br.readLine(); if(strLine.equalsIgnoreCase("quit")) break; System.out.println(strLine); String strEcho = new StringBuffer(strLine).reverse().toString(); p.println(strLine + "-->>" + strEcho); } br.close(); p.close(); c.close(); } catch (IOException e) { e.printStackTrace(); } } }
如何检测和解决端口冲突问题
1、使用netstat命令查看当前正在被使用的TCP端口号。(netstat -na)
2、通过一个配制参数来指定TCP服务程序所使用的端口。
3、将用户指定的端口号保存到一个文件中,当服务器程序下次启动运行时,直接从文件中读取那个端口号。
TCP客户端程序
package com.cn; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String args[]){ try { Socket c = new Socket("127.0.0.1",8888); InputStream in =c.getInputStream(); OutputStream out = c.getOutputStream(); BufferedReader bc =new BufferedReader(new InputStreamReader(in)); PrintWriter pr = new PrintWriter(out,true); BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); while(true){ String strech = br.readLine(); pr.println(strech); if(strech.equalsIgnoreCase("quit")) break; System.out.println(bc.readLine()); } br.close(); bc.close(); c.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
在TCP网络连接上传递对象
1、ObjectInputStream和ObjectOutputStream可以从底层输入流中读取对象类型的数据和将对象数据写入到底层输出流。
2、ObjectInputstream和ObjectOutputstream来包装底层网络字节流,TCP服务器和TCP客户端之间就可以传递对象类型的数据。
3、编程实例:(通过网络传输Java对象)
package com.cn; public class Student implements java.io.Serializable{ private static final long serialVersionUID = 1L; private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package com.cn; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String args[]){ try { ServerSocket s =new ServerSocket(8888); Socket c = s.accept(); OutputStream out = c.getOutputStream(); ObjectOutputStream ot = new ObjectOutputStream(out); Student sdt = new Student(); sdt.setId(1); sdt.setName("张三"); sdt.setAge(20); ot.writeObject(sdt); ot.close(); out.close(); c.close(); s.close(); } catch (IOException e) { e.printStackTrace(); } } }
package com.cn; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) { try { Socket c = new Socket("127.0.0.1",8888); InputStream in = c.getInputStream(); ObjectInputStream oin = new ObjectInputStream(in); Student std = (Student) oin.readObject(); System.out.println("学号:"+std.getId()+"\n性名:"+std.getName()+"\n年龄:"+std.getAge()); oin.close(); in.close(); c.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
访问Internet网络资源
java.net包中还有URL、URLDecoder、URLEncoder、URLConnection、HttpURLConnection等类。
URL(Uniform Resure Locator统一资源定位符)
1、URL的基本组成:协议、主机名、端口号、资源名。
2、URL编码规则:
将空格转换为加号(+)。
对0~9,a~z,A~Z之间的字符保持不变。
对于所其它的字符,有这个字符的当前字符集编码在内存中的十六进制
格式表示,并在每个字节前加上一个百分号(%)。如字符“+”用%2B表示
,字符“=”用%3D表示,字符“&”用%26表示,每个中文字符在内存中占两个
字节,字符“中”用%D6%D0表示,字符“国”用%B9%FA表示。
3、java.net包中提供了URLEncoder和URLecoder这两个类,来实现URL编码和解码。
HTTP协议
TTTP协议的会话过程
基于HTTP 1.0协议的客户机与服务器的信息交换过程(客户机--建立连接--发送请求信息——》服务器--发出响应信息--关闭连接--》客户机);
基于HTTP 1.1协议的客户机与服务器的信息交换过程(客户机--建立连接--发出第1~n次连接-》服务器--发出第1~n次连接--关闭连接--》客户机);
HTTP请求消息 一个完整的请求消息包括:一个请求行、若干消息头、以及实体内容。
一个完整的响应消息包括:一个状态行、若干消息头、以及体内容。
几个HTTP消息头
1、Connection 用于指定处理完本次请求/响应后,客户端与服务器是否继续保持连接,设置值可以为keep-Alive和close.
2、Accept-Language 用于指定客户机期望服务器返回的文档所使用的语言,可以指定多个以逗号分隔的国家语言。
3、Content-Length 用于表示实体内容的长度(字节数)。
4、Range 用于指定服务器只需返回文档中的部分内容及内容范围,有以下几种使用格式:
Range:bytes=100-599
Range:bytes=100-
Range:bytes=-100
5、Content-Range 用于指定服务器返回的部分实体内容的位置信息,例如:Content-Range:bytes 2543-4531/7898
telnet www.g.cn 80
GET / HTTP/1.1
Hosst:
Accept-Language: zh-cn
URL类
构造函数(都可能引发MalformedURLException异常):
URL(String spec) 根据 String 表示形式创建 URL 对象。
URL(String protocol, String host, int port, String file) 根据指定 protocol、host、port 号和 file 创建 URL 对象。
URL(String protocol, String host, int port, String file, URLStreamHandler handler) 根据指定的 protocol、host、port 号、file 和 handler 创建 URL 对象。
URL(String protocol, String host, String file) 根据指定的 protocol 名称、host 名称和 file 名称创建 URL。
URL(URL context, String spec) 通过在指定的上下文中对给定的 spec 进行解析创建 URL。
URL(URL context, String spec, URLStreamHandler handler) 通过在指定的上下文中用指定的处理程序对给定的 spec 进行解析来创建 URL。
工厂设计模式
URL类的setURLStreamHandlerFactory(URLStreamHandlerFactory fac)设置应用程序的 URLStreamHandlerFactory。在一个给定的 Java 虚拟机中,此方法最多只能调用一次。
URLStreamHandlerFactory类的createURLStreamHandler(String protocol) 创建具有指定协议的新 URLStreamHandler 实例。
URLConnetion和HttpURLConnetin类
通过在 URL 上调用 openConnection 方法创建连接对象。
处理设置参数和一般请求属性。
使用 connect 方法建立到远程对象的实际连接。
远程对象变为可用。远程对象的头字段和内容变为可访问。
setRequestProperty(String key, String value) 设置一般请求属性。
getHeaderFields() 返回头字段的不可修改的 Map。
getInputStream() 和 getOutputStream() 返回从此打开的连接读取的输入出流
getHeaderField(int n) 返回第 n 个头字段的值。
getHeaderField(String name) 返回指定的头字段的值。
getContentLength() 返回 content-length 头字段的值。
getContentEncoding() 返回 content-encoding 头字段的值。
getContentType() 返回 content-type 头字段的值。
一个HTTP连接可以被多个HttpUPLConnection实例对象共享,调用HttpURLConnection的disconnect方法可以关闭底层共享网络。
实例:
package com.cn; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import java.util.Iterator; import java.util.Map; import java.util.Set; public class GetGoogle { public static void getConterByLanguage(String country){ try { URL urlGoogle = new URL("http://www.google.com"); HttpURLConnection googleConnection = (HttpURLConnection) urlGoogle.openConnection(); googleConnection.setRequestProperty("Accept-Language" , country); Map requests = googleConnection.getRequestProperties(); Set reqFields = requests.keySet(); Iterator itrReq = reqFields.iterator(); while(itrReq.hasNext()){ String field = (String) itrReq.next(); System.out.println(field + " : " + googleConnection.getRequestProperty(field)); } googleConnection.connect(); Map responses = googleConnection.getHeaderFields(); Set resFields = responses.keySet(); Iterator itrRes = resFields.iterator(); while(itrRes.hasNext()){ String field = (String) itrRes.next(); System.out.println(field + " : " + googleConnection.getHeaderField(field)); } InputStream is = googleConnection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String strLine = null; while((strLine = br.readLine()) != null){ System.out.println(strLine); } br.close(); googleConnection.disconnect(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { System.out.println("获取日文页面"); getConterByLanguage("ja"); System.out.println("\n"); System.out.println("获取中文页面"); getConterByLanguage("zh-cn"); } }
发表评论
-
java版 纸牌
2012-05-30 15:43 855java 纸牌游戏,有连翻一张或三张两种玩法,程序在部分点击区 ... -
java版 推箱子
2012-01-12 17:24 1488java版 推箱子源码 import javax.swin ... -
java 基础加强
2011-01-07 14:17 758java基础 jdk1.5 新特征 ... -
网络五子棋
2011-01-05 15:50 1040最近空限,完成之前未完成的网络五子棋,它是面向TCP协 ... -
java图片处理:文字图像水印 缩放补白
2010-12-28 11:40 1159package com.util; import j ... -
Java2D绘制五星红旗
2010-12-27 09:17 1151/** 使用Java2D绘制五星红旗 五星 ... -
IO/输入输出
2010-12-21 14:14 1429IO/输入输出 File类 它是 ... -
银行业务调度系统
2010-08-19 18:34 1325模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6 ... -
交通灯管理系统
2010-08-18 13:16 1290模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异 ... -
贪吃蛇游戏
2010-08-17 08:32 1696对大多数人来说,要想自己编写出《贪吃蛇》游戏的程序 ... -
蜘蛛牌
2010-08-15 00:17 1860蜘蛛牌在朴克牌游戏当中是比较有趣的游戏,特别是闯关成功 ... -
j2se版俄罗斯方块
2009-10-21 21:22 14551.图形界面 import java.awt.*; ... -
豆子吃妖精
2009-10-19 21:30 768本程序是运用了图形化画版和多程技术,只支持固定运行轨迹, ... -
连连看
2009-10-09 20:54 1012java不易开发大型游戏,但任一语言都有是相通,本程序运 ... -
Globle Get 多线程下载系统
2009-10-07 21:41 1086GlobalGet”是实现HTTP协议和FTP协议的多线程下载 ... -
控制台五子棋
2009-08-17 20:15 915<p>这是一个控制台的五子棋,它的妙处是它算法侦听 ...
相关推荐
《Java网络编程第三版》是Java开发者深入理解网络编程的重要参考资料。这本书主要涵盖了Java平台上的网络应用程序开发,从基础概念到高级技术,为读者提供了一套全面的学习路径。以下是本书中涉及的一些关键知识点:...
Windows 网络编程 概述 Windows 网络编程是指在 Windows 操作系统平台上进行网络编程的技术,涉及到 Windows Socket、网络协议、网络应用程序的开发等方面。 Windows 网络编程的主要目的是实现高性能的网络应用...
扫描版 超清百度网盘资源!!! 为初学者准备的网络编程! 韩国TCP/IP经典教程!... 本书针对网络编程初学者,面向具备C语言基础的套接字网络编程学习者,适合所有希望学习Linux和Windows网络编程的人。
C++网络编程是计算机科学中的一个重要领域,它允许开发者创建能够通过网络进行通信的应用程序。这份"C++网络编程文档"涵盖了这一主题的广泛内容,旨在帮助程序员深入理解并掌握网络编程的基本概念和技术。 首先,...
《C#网络编程实例教程源代码》是一份深入浅出的教学资源,旨在帮助开发者掌握C#语言在网络编程领域的应用。这份教程结合了理论与实践,提供了丰富的源代码示例,让学习者能够通过实际操作来理解和掌握网络编程的核心...
《Linux网络编程教程》这本书是Linux系统中进行网络编程的重要参考资料。它涵盖了广泛的知识点,旨在帮助读者理解和掌握如何在Linux环境下开发网络应用程序。以下是对这些主题的详细阐述: 1. **网络编程基础**:...
《Java网络编程(第四版)》是一本深入探讨Java在互联网环境下的编程技术的经典书籍。本书旨在帮助读者理解和掌握如何利用Java语言进行高效、安全的网络通信。书中内容覆盖了从基本的网络概念到复杂的多线程编程,是...
C++ 网络编程实例 本文档提供了 C++ 网络编程的基础知识,涵盖了网络编程的概述、OSI 七层网络模型、TCP/IP 协议和 C/S 编程模型等内容。 网络编程概述 网络编程是指用户使用 MFC 类库在 VC 编译器中编写程序,以...
linux网络编程 pdf # Linux网络编程基础 Linux网络编程是指在Linux操作系统上开发网络应用程序的过程。它主要涉及到TCP/UDP协议以及select/poll/epoll等多路复用技术。 TCP/UDP协议是网络通信的基础,其中TCP协议...
《Java网络编程(第4版)》是一本深入探讨Java平台上的网络编程技术的专业书籍,适合想要提升Java通讯技术的学者阅读。此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的...
"Java网络编程实验报告" 本实验报告主要介绍了Java网络编程的基本概念和实现方法,通过设计和实现一个简单的客户端/服务器应用程序,了解Java网络编程的基本原理和实现方法。 知识点1:Java 网络编程基础 Java ...
Java网络编程案例教程习题参考答案 Java_network_programming是Java编程语言中一个基础组件,用于实现网络通信。以下是Java网络编程案例教程习题参考答案中涉及到的知识点: 1. Socket编程:Socket是Java网络编程...
《Unix网络编程》是一套由美国著名计算机科学家W. Richard Stevens撰写的经典教材,涵盖了Unix系统下的网络编程各个方面。这套书共分为三卷,每卷都深入探讨了其主题,对于理解和掌握网络编程技术具有极高的参考价值...
《UNIX网络编程》第一卷主要涵盖了网络编程的基本概念、传输层协议TCP和UDP的细节、套接口编程的原理与应用,以及高级网络编程技术。该书是网络编程领域的经典之作,作者是著名的网络编程专家W. Richard Stevens。...
《Visual C++网络编程案例实战》一书深入探讨了如何利用Visual C++及MFC类库进行网络编程,尤其强调了Windows Socket的应用。本书不仅覆盖了理论基础,还提供了丰富的实践案例,帮助读者掌握网络编程的核心技能。 #...
Linux C 网络编程面试题收集 本文总结了 Linux C 网络编程面试题,涵盖了基础知识、网络编程、路由等方面的知识点,旨在帮助读者更好地理解和掌握相关知识。 一、基础知识 1. 对于程序 `func(char *str){printf(...
这本书是关于c#网络编程的,关于c#入门的书有很多,但是关于c#网络编程的并不多,很多教材中虽有涉及网络编程但都是泛泛而谈,很多理论概念掺杂在其中,让人很难理解,而这本不同,含有非常多的例子,从简到深,甚至...
《UNIX网络编程》(第1卷)(套接口API第3版)第1版和第2版由已故UNIX网络专家W. Richard Stevens博士独自编写。《UNIX网络编程》(第1卷)(套接口API第3版)是3版,由世界著名网络专家Bill Fenner和Andrew M. Rudoff执笔,...
《UNIX环境高级编程》与《UNIX网络编程卷1:协议》是两本深入解析UNIX系统编程的经典著作。在深入理解这些书籍的知识点之前,我们先要了解UNIX系统的基础概念。 UNIX是一个多用户、多任务的操作系统,其设计哲学...
全书分为10章,第1章介绍网络编程的基本概念及模式,第2章介绍套接字网络编程基础,第3章介绍Windows环境的WinSock编程基础,第4章介绍MFC编程,第5章介绍MFC WinSock类的编程,第6章介绍WinInet编程,第7章介绍...