java_网络编程学习笔记(三)

客户端和服务端演示笔记

浏览器客户端和自定义服务端

自定义服务端:
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上执行一些其他操作。
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

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值