客户端和服务端演示笔记
浏览器客户端和自定义服务端
自定义服务端:
package cn.wangyu.net;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author JiangMinyan
*
* @version 2016/02/23 8:53:40
*/
public class MyTomcat {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(10007);
Socket client = server.accept();
System.out.println(client.getInetAddress().getHostAddress()+"...connected");
// PrintWriter out = new PrintWriter(client.getOutputStream(), true);
// out.println("hello client......");
OutputStream out = client.getOutputStream();
out.write("hello client...".getBytes());
client.close();
server.close();
}
}
浏览器客户端:自定义服务器设定监听10007端口的应用程序,使用浏览器访问该服务器的10007端口。
浏览器客户端和Tomcat服务器
Tomcat服务器端:在tomcat安装目录的webapps文件夹中创建myweb文件夹创建1.html
1.html:
<html>
<body>
<h1>this is my myweb</h1>
</body>
</html>
浏览器客户端
自定义浏览器和Tomcat服务器
当浏览器想服务器端访问资源,会发送给服务器端一些信息。
所以说要自定义浏览器,需要给服务器段发送这个请求消息。
自定义浏览器:
package cn.wangyu.net;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* @author JiangMinyan
*
* @version 2016/02/23 9:49:43
*/
public class MyIE {
public static void main(String[] args) throws Exception{
Socket client = new Socket("192.168.21.158", 8080);
//想Tomcat发送请求消息
PrintWriter out = new PrintWriter(client.getOutputStream(), true);
out.println("GET /myweb/1.html HTTP/1.1");
out.println("Accept: text/html, application/xhtml+xml, */*");
out.println("Accept-Language: ja-JP");
out.println("Accept-Encoding: gzip, deflate");
out.println("Host: 192.168.21.158:8080");
out.println("Connection: Keep-Alive");
out.println();
out.println();
//获取Tomcat的响应信息
BufferedReader bufr = new BufferedReader(new InputStreamReader(client.getInputStream()));
String line = null;
while((line = bufr.readLine()) != null){
System.out.println(line);
}
client.close();
}
}
Tomcat相应信息;java封装的URLConnection对象
URL对象:
URL类使得访问web资源与访问机器上的本地资源一样简单。URL代表统一资源定位器。
URL类是对URL标识符的抽象。提供的函数可用于:打开到指定URL的链接,从URL中读取数据或往URL中写入数据,读取和写入头信息,以及在URL上执行一些其他操作。
URL类是对URL标识符的抽象。提供的函数可用于:打开到指定URL的链接,从URL中读取数据或往URL中写入数据,读取和写入头信息,以及在URL上执行一些其他操作。
package cn.wangyu.net;
import java.net.URL;
/**
* @author JiangMinyan
*
* @version 2016/02/23 10:28:43
*/
public class URLDemo {
public static void main(String[] args)throws Exception {
URL url = new URL("http://192.168.21.158:8080/myweb/1.html?name=james&age=20");
System.out.println("getProtocol() : " + url.getProtocol());//协议
System.out.println("getHost() : " + url.getHost());//主机
System.out.println("getPort() : " + url.getPort());//端口
System.out.println("getPath() : " + url.getPath());//路径
System.out.println("getFile() : " + url.getFile());//文件
System.out.println("getQuery() : " + url.getQuery());//查询信息
}
}
输出-->getProtocol() : http
getHost() : 192.168.21.158
getPort() : 8080
getPath() : /myweb/1.html
getFile() : /myweb/1.html?name=james&age=20
getQuery() : name=james&age=20
getHost() : 192.168.21.158
getPort() : 8080
getPath() : /myweb/1.html
getFile() : /myweb/1.html?name=james&age=20
getQuery() : name=james&age=20
URLConnection:
在URL实例上打开链接会返回类型为URLConnection的对象。URLConnection是代表应用程序与URL之间通信连接的抽象类,HttpURLConnection和JarURLConnection提供了该类的具体实现。一旦连接建立后,就可以通过调用setDoInput方法来设置从服务器到应用程序的向内通信,这也是默认行为。类似的,为了向服务器写入数据,可以调用setDoOutput方法,将连接设置成输出模式。DoOutput方法的标志位默认为false。
package cn.wangyu.net;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
/**
* @author JiangMinyan
*
* @version 2016/02/23 10:35:23
*/
public class URLConnectionDemo {
public static void main(String[] args) throws Exception{
URL url = new URL("http://192.168.21.158:8080/myweb/1.html");
//帮你做连接主机的操作,底层封装Socket。
//使用socket进行连接,是在传输层进行连接,而使用URLConnection对象是在应用层进行连接,并且封装好协议HTTP
URLConnection conn = url.openConnection();//表示到URL引用的远程对象的连接
//(输出)sun.net.www.protocol.http.HttpURLConnection:http://192.168.21.158:8080/myweb/1.html
System.out.println(conn);
//建立连接就是为了获取资源,找到URLConnection中获取流对象的方法。
InputStream in = conn.getInputStream();
byte[] bufr = new byte[1024];
int len = in.read(bufr);
//发现控制台不会像socket对象获取服务器端信息时输出响应头
System.out.println(new String(bufr, 0, len));
}
}
小知识点
//InetAddress是Java对IP地址的封装,代表互联网协议(IP)地址;
// InetAddress对象的获取只能通过静态方法,比如根据主机名获取主机的ip地址封装对象:
// InetSocketAddress是SocketAddress的实现子类。
//
// 此类实现 IP 套接字地址(IP 地址 + 端口号),不依赖任何协议。
// 在使用Socket来连接服务器时最简单的方式就是直接使用IP和端口,但Socket类中的connect方法并未提供这种方式,而是使用SocketAddress类来向connect方法传递服务器的IP和端口。
// SocketAddress只是个抽象类,它除了有一个默认的构造方法外,其它的方法都是abstract的,因此,我们必须使用SocketAddress的子类来建立SocketAddress对象,也就是唯一的子类InetSocketAddress
// InetAddress对象的获取只能通过静态方法,比如根据主机名获取主机的ip地址封装对象:
// InetSocketAddress是SocketAddress的实现子类。
//
// 此类实现 IP 套接字地址(IP 地址 + 端口号),不依赖任何协议。
// 在使用Socket来连接服务器时最简单的方式就是直接使用IP和端口,但Socket类中的connect方法并未提供这种方式,而是使用SocketAddress类来向connect方法传递服务器的IP和端口。
// SocketAddress只是个抽象类,它除了有一个默认的构造方法外,其它的方法都是abstract的,因此,我们必须使用SocketAddress的子类来建立SocketAddress对象,也就是唯一的子类InetSocketAddress