`

黑马程序员--java基础复习--NET网络编程

 
阅读更多

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ---------------------

网络编程听起来非常高端大气上档次是不是,确实是这样的,网络编程目的就是指直接或间接地通过网络协议与其他计算机进行通讯。有了这个,从此我们不再孤独了。不孤独的前提是我们必须要能正确的用网络编程来连接到其他的计算机,那么

一、网络编程的基础知识

   目前网络模型分为C/S 和B/S两种,互联网技术的发展使得B/S构架越来越占主流,因为B/S架构不要求客户端计算机上拥有大量的数据支持,很多操作都是发给服务器处理的,对于越来越流行的手机客户端,这是相当有竞争力的。那不管是C/S 还是B/S架构,都存在服务器和客户端,服务器一直监听客户端的请求,当监听到一个请求的时候,就做相应的处理(开启一个线程来处理),监听线程继续监听;再来个客户端请求,就再建立一个线程来处理。

  在数据的传输中,有两种传输协议:TCP和DCP

  TCP:要求建立连接的可靠协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。

   一般格式为:

 客户端:

  

Socket s = new Socket("ip 地址",12345);

 服务器(支持多客户端访问)

   

ServerSocket ss = new ServerSocket(12345);
		
		while(true){
			Socket s = ss.accept();
			new Thread(new PicThread(s)).start();
		}	

 UDP:一种无连接的协议,每个数据包都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。 每个数据包最大的大小为64K。因为数据包上已经封装了目的地的详细信息,所以不需要建立连接,因为不建立连接,所以该协议可能会丢失数据,UDP协议常用于视频、聊天、视频会议、网络教学等,因为效率。

一般格式为

 发送端:发送端定义的数据包是用来发送的,必须带有目的地的详细信息

 

DatagramSocket ds = new DatagramSocket(); 
DatagramPacket dp = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getLocalHost(), 8888);
				ds.send(dp);

 

 接收端:接收端定义的数据包是用来存放接收到是数据的,可定义大小。

 

 

 

 

DatagramSocket ds = new DatagramSocket(8888)
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(ap)

 二、网络编程中的URL

在java中的net包里边还给我们提供了URL类,这个类有很多的作用在处理一个诸如http://www.baidu.com

的网络地址时,就可以先将这个地址创建为一个URL类,然后通过这个类的方法分别获得所需要的信息,比如:

    public String getProtocol() 获取该URL的协议名。
    public String getHost() 获取该URL的主机名。
    public int getPort() 获取该URL的端口号,如果没有设置端口,返回-1。
    public String getFile() 获取该URL的文件名。
    public String getRef() 获取该URL在文件中的相对位置。
    public String getQuery() 获取该URL的查询信息。
    public String getPath() 获取该URL的路径
    public String getAuthority() 获取该URL的权限信息
    public String getUserInfo() 获得使用者的信息
    public String getRef() 获得该URL的锚

 

还可以通过这个URL地址来与目标创建连接,读取网络资源

InputStream openStream();

URLConnection openConnection()

 

URLConnection 类中提供了获取输出流和读取流的方法,可以通过这些方法来获得连接参数(先写在这里,具体用处还需要学习WEB了才能更熟悉)。

 

下面粘贴下自制的服务器与浏览器,是仿照毕向东老师的视频做的

服务器:

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

public class ServerDemo
{
	public static void main(String[] args) throws Exception{
		ServerSocket ss = new ServerSocket(13000);
		System.out.println(ss.getInetAddress().getHostAddress());
		
		Socket s = ss.accept();//这个服务器只服务一次
		InputStream in = s.getInputStream();//获得读取流,可以读取客户端的请求信息
		PrintWriter pw = new PrintWriter(s.getOutputStream(), true);//获得输出流,并封装成PrintWriter,可以向
																	//客户端发信息哦

		byte[] buf = new byte[1204];
		in.read(buf);

		System.out.println(new String(buf));//打印客户端请求信息

		pw.println("<font size = '6' color = 'green'>xxxx 你好</font>");//向客户端回应一点东西

		s.close();

		ss.close();
	}
}

 浏览器端(客户端端)这里边就是创建了一个图形化界面,然后再按钮事件中加入了解析我们山寨URL地址的一些代码,可以访问我们山寨的服务器

package exercise;

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;

public class MyBrowser {
	private Frame f;
	private TextField tf;
	private Button but;
	private TextArea ta;
	private Container con;
	public static void main(String[] args) {
		new MyBrowser();
	}
	
	public MyBrowser(){
		init();
	}
	
	public void init(){
		f = new Frame("刘旺民 1.1");
		tf = new TextField("www.google.com");
		but = new Button("转到");
		ta = new TextArea();
		con = new Container();
		
		f.setBounds(300, 300, 500, 400);
		tf.setColumns(50);
		con.setLayout(new FlowLayout());
		con.add(tf);
		con.add(but);
		con.setVisible(true);
		f.add(con, BorderLayout.NORTH);
		f.add(ta);
		
		f.setVisible(true);
		
		myEvent();
	}
	
	public void myEvent(){
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		but.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				Socket s = null; 
				try {
					ta.setText("");
					String str1 = tf.getText();
					int index = str1.indexOf("//");
					str1 = str1.substring(index +2);
					String[] strs = str1.split(":");
					s = new Socket(strs[0], Integer.parseInt(strs[1]));//关键在这里,连上山寨的服务器
					PrintWriter out = new PrintWriter(s.getOutputStream(), true);//发送客户端请求信息
					out.println("GET " + str1 + " HTTP/1.1");//发送客户端请求信息
					out.println("Host: localhost:13000");//发送客户端请求信息
					out.println("Connection: keep-alive");//发送客户端请求信息
					out.println("Accept-Encoding: gzip,deflate,sdch");//发送客户端请求信息
					out.println("Accept-Language: zh-CN,zh;q=0.8");//发送客户端请求信息
					out.println("Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3");//发送客户端请求信息
					
					out.println();					
					out.println();					
					out.println();
					
					InputStream in = s.getInputStream(); //获得服务器返回信息的读取流
					byte[] buf = new byte[1024*1024];
					
					int len = in.read(buf);
					
					String str = new String(buf, 0, len); //获得的返回信息
					ta.setText(str + "\r\n");//将返回信息显示到文本区域
					ta.append(str1);
					
				} catch (UnknownHostException e1) {
					e1.printStackTrace();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		});
	}

}


 运行结果:

 服务器端--黑窗口:



 

浏览器端:



 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net

  • 大小: 23.3 KB
  • 大小: 40.4 KB
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics