码迷,mamicode.com
首页 > 编程语言 > 详细

黑马程序员——java高新技术——网络编程

时间:2015-08-06 16:58:00      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:网络编程   黑马程序员   技术   

点击打开链接 点击打开链接 点击打开链接 android培训、<a">点击打开链接 点击打开链接 java培训、期待与您交流!">点击打开链接 点击打开链接

 

网络编程

网络模型

l   OSI参考模型

l   TCP/IP参考模型

 

网络通讯要素

l   IP地址:网络中设备的标识,不易记忆,可用主机名,本地回环地址,127.0.0.1  主机名:localhost

l   端口号:用于标识进程的逻辑地址,不同进程的标识,有效端口:0~65535,其中0~1024系统使用或保留端口

l   传输协议:通讯的规则,常见协议:TCPUDP

 

网络通讯的一般过程

1.找到对方IP

2.数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识。为了方便称呼这个数字,叫做 端口,逻辑端口。0~65535

3.定义一个通信规则。这个通讯规则成为协议。国际组织定义了通用协议TCP/IP通信。UDP

 

InetAddress类:此类表示互联网协议(IP)地址

static InetAddress  | getLocalHost():获取本地主机

String  |   getHostAddress():返回IP地址字符串

String  |   getHostName():获取此IP地址的主机名

static InetAdress  |   getByAddress(byte[] addr):再给定原始IP地址的情况下,返回InetAddress对象

Static InetAddress  |  getByAddress(String host,byte[] addr):根据给定主机和IP地址创建InetAddress

Static InetAddress  |  getByName(String host)在给定主机的情况下确定主机的IP地址。

static InetAddress[]  |  getAllBynames(String host):在给定主机名的情况下,根据系统上配置的名称服务返回其所组成的数组。

 

TCP和UDP

UDP:聊天,视频会议

   将数据及源和目的封装成数据包中,不需要建立连接

   每个数据报的大小限制在64K

   因无连接,是不可靠协议

   不需要建立连接,速度快

TCP:下载

   建立连接,形成传输数据的通道

   在连接中进行大数据量传输

   通过三次握手完成连接,是可靠协议

   必须建立连接,效率会稍低

 

UDP传输

DatagramSocket:此类表示用来发送和接收数据报包的套接字。

构造函数:DatagramSocketint port:指定端口

           DatagramSocket():

重要方法:

 void  |  send(DatagramPacket p):发送数据报包

 void  |  receive(DatagramPacket p) :接收数据报包

 

DatagramPacket 类:此类表示数据报包。

构造函数:

DatagramPacket(byte[] buf,int length)

DatagramPacket(byte[] buf,int length,InetAddress address,int port)

重要方法:

 InetAddress  |  getAddress():返回此数据报将要发往该主机或者从该机器接收到的IP地址。

  byte[]      |  getData():返回缓冲区数据

    int       |  getLength():返回将要发生或接收到的数据的长度

 int      |  getPort():获取此数据报将要发送往该主机或从该主机接收到的端口

 

通过UDP传输方式,将一段文字数据发送出去。

1.建立updSocket服务

2.提供数据,并将数据封装到数据包中

3.通过socket服务的发送功能,将数据包发送出去

4.关闭资源

 

定义一个应用程序,用于接收UDP传输的数据并处理

1.定义udpSocket服务,通常会接收一个端口,其实就是给这个网络应用程序定义数字标识,方便于明确哪些数据过来该应用程序可以处理。

2.定义一个数据包,因为要存储接收到的数据,数据包对象中有更多功能可以提前字节数据中的不同数据信息。

3.通过socket服务的receive方法将收到的数据存入已定义好的数据包中

4.通过数据包特有的功能,将这些不同的数据取出,打印在控制台上

5.关闭资源

 UDP练习:

import java.util.*;
import java.io.*;
import java.net.*;
class UDP3 
{
	public static void main(String[] args) 
	{
		new Thread(new UDPSend3()).start();
		new Thread(new UDPReceive3()).start();
	}
}

class UDPSend3 implements Runnable
{
	public void run()
	{
      try
      {
		DatagramSocket ds=new DatagramSocket();

		//建立一个IO流接收数据
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

		for(String str=br.readLine();str!=null;str=br.readLine())
		{
                         byte[] buf=str.getBytes();
			 DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),1002);
			 ds.send(dp);
			 if("over".equals(str))
				 break;
		}
		ds.close();
      }
      catch (Exception e)
      {
		  System.out.println(e);
      }
	   
	}
}

class UDPReceive3 implements Runnable
{
      public void run()
	{
	  
	   try
	   {
		  DatagramSocket ds=new DatagramSocket(1002);
		 while(true)
		 {
			byte[] buf=new byte[1024];
			DatagramPacket dp=new DatagramPacket(buf,buf.length);
			ds.receive(dp);
			String info=new String(buf,0,dp.getLength());
			System.out.println(dp.getAddress()+"::"+info);
			if("over".equals(info))
				break;
		 }
		 ds.close();
	   }
	   catch (Exception e)
	   {
		   System.out.println(e);
	   }
	}
}


 

TCP传输

SocketServerSocket

l 建立客户端和服务器端

l 建立连接后,通过Socket中的IO流进行数据的传输

l 关闭Socket

l 同样,客户端和服务器端是两个独立的应用程序。

 

Socket类:此类实现客服端套接字

常用构造函数:Socket()  Socket(InetAddress address,int port)  Socket() 

常用方法:

Void | close():关闭此套接字

Void | connect(SocketAddress endpoint):将此套接字连接到服务器。

InetAdddress | getInetAddress():返回此套接字连接的地址

InputStream | getInputStream():返回此套接字的输入流

OutputStream | getOutputStream():返回此套接字的输出流

Int  | getPort():返回此套接字连接到的远程端口

Void | shutdownInput():此套接字的输入流置于“流的末尾”。

Void | shutdowmOutput():禁用此套接字的输出流。

 

ServerSocke此类实现服务器套接字

常用构造函数:ServerSocket()    ServerSocket(int port)

常用方法:

Socket | accept():侦听并接受到此套接字的连接

 

URL类:代表一个统一资源定位符,它是指向互联网“资源”的指针。

URL(String spec)

重要方法:

String | getFile():获取此URL的文件名

String | getHost():获取此URL的主机名

String | getPath():获取此URL的路径部分

String | getProtocol():获取此URL的协议名称

String | getQuery():获取此URL的查询部分

URLConnection | openConnection():返回一个表示到URL所引用的远程对象的连接。

InputStream | openStream():打开到此URL的连接并返回一个用于从该连接读入的InputStream

 

URLConnection类:抽象类,代表应用程序和URL之间的通信连接。

重要方法:

InputStream | getInputStream():返回从此打开的连接读取的输入流

OutputStream | getOutputStream():返回写入到此链接的输入流。

 

客户端

通过查阅socket对象,发现在该对象建立时,就可以去连接指定主机,因为TCP是面向连接的,所以在建立socket服务时,就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输。

步骤:

1.创建socket服务,并指定要连接的主机和端口。

   Socket(String host,int port);

2.为了发送数据,应该获取socket流中的输出流

 getOutputStream()

 Write()

3.关闭服务

 

服务端

1.建立服务端的socket服务,ServerSocket

   ServerSocketint port)接听一个端口

2.获取连接过来的客服端对象。

      通过accept()方法,获取Socket,没有连接就会等,所以这个方法是阻塞式的

3.客服端如果发送过来数据,那么服务端使用对应的客服端对象,并获取到该客服端对象的读取流来读取发过来的数据,并打印在控制台。

4.关闭服务端(可选)

 

//TCP终极练习
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
class  TCP
{
	private Frame f;
	private TextField tf;
	private Button bt;
	private TextArea ta;
	TCP()
	{
		init();
	}
	public void init()
	{
		f=new Frame("我的浏览器");
		f.setBounds(100,100,600,600);
		f.setLayout(new FlowLayout());
		
		tf=new TextField(60);
		bt=new Button("转到");
		ta=new TextArea(30,66);

		f.add(tf);
		f.add(bt);
		f.add(ta);
        
		myEvent();
		f.setVisible(true);
	}
	public void myEvent()
	{
		bt.addActionListener(new ActionListener()
		{
           public void actionPerformed(ActionEvent e)
		   {
			try
            {
				ta.setText("");
			    String ip=tf.getText();
			    URL url=new URL(ip);
			    URLConnection uc=url.openConnection();
			    InputStream In = uc.getInputStream();
			    byte[] buf=new byte[1024];
				int len=0;
		    	while((len=In.read(buf,0,buf.length))!=-1)
		    	{
			    	ta.append(new String(buf,0,len));
			    }

            }
            catch (Exception ee)
            {
               throw new RuntimeException("登陆服务器失败!");
            }
		 }
		});
		f.addWindowListener(new WindowAdapter()
		{
			public void windowClosing(WindowEvent e)
			{
				System.exit(0);
			}
		});
	}
	public static void main(String[] args) 
	{
		new TCP();
	}
}


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

黑马程序员——java高新技术——网络编程

标签:网络编程   黑马程序员   技术   

原文地址:http://blog.csdn.net/libin1127/article/details/47317699

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!