首页 > 编程语言 > 详细

java基础9:网络编程

时间:2015-04-08 21:33:06      阅读:168      评论:0      收藏:0      [点我收藏+]

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 一、概述


注:以前软考的时候总结过一篇关于网络的基本知识,大家可以参考一下http://blog.csdn.net/jin870132690/article/details/41597135


只要接触过网络的人就不会不知道网络的重要性,网络编程指的是编写与其他计算机进行通信的程序。java已经将网络程序所需的东西封装成了不同的类。大大简化了我们的编程的难度。

1、网络模型

网络模型包括OSI七层模型和TCP\IP模型

技术分享技术分享


2、通讯要素

1、IP地址

它是网络中的设备标识,分为ipv4和ipv6,常见的ip4地址分ABC三类

IP地址在java中对应的类是InetAddress

<span style="font-size:14px;">		//获取本地主机名
		InetAddress ip = InetAddress.getLocalHost();
		
		//根据主机名或者ip,获取Ip地址
		ip = InetAddress.getByName("www.baidu.com");
		
		//有的时候主机可能不唯一,用getAllByName();
//		InetAddress[] ip2 = InetAddress.getAllByName(ip.getHostName());
//		for (InetAddress inetAddress : ip2) {
//			System.out.println(inetAddress);
		
		System.out.println("address:" + ip.getHostAddress());
		System.out.println("name:" + ip.getHostName());</span>


2、端口号

端口号用于识别不同的进程,有效端口号为0-65535,其中0-1024是系统使用或保留端口号,尽量不要使用

3、通讯协议 

即通信规则,包含TCP和UDP协议


UDP是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。适用于一次只传送少量数据、对可靠性要求不高的应用环境

常用于UDP连接的比如说在线视频语音聊天等应用环境,对可靠性要求低,丢失一点数据也无所谓。


TCP是基于连接的协议,也就是说,在正式收发数据前,要进行三次握手,确保和对方建立可靠的连接。

 TCP协议能为应用程序提供可靠的通信连接,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。

TCP协议一般用于文件传输、收发邮件等对数据准确性要求较高的活动。


 二、UDP传输


1, 接收端与发送端交互过程

接收数据包

a,通过DatagramSocket创建发送端

b,将要发送的数据封装在DatagramPacket包中

c,调用send方法发送。

接收数据包

a,通过DatagramSocket创建接收端

b,将受到的数据封装在DatagramPacket包中

c,通过recive接收包


2、举例:聊天室

接收端

<span style="font-size:14px;">package jinfulin.UDP.Demo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReDemo {
	/*
	 * 需求:创建接收端并接收文字 分析: 
	 * 1,建立socket服务, 
	 * 2,建立packet包
	 *  3,将接收到的数据封装在packet中
	 *   4,读取包中的内容
	 * 5,关闭服务
	 */
	public static void main(String[] args) throws IOException {
		System.out.println("接收端已启动");
		while (true)// 接收端一直启动
		{
			// 1,建立socket服务
			DatagramSocket ds = new DatagramSocket(12000);
			// 2,建立packet包
			byte[] buf = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buf, buf.length);
			// 3,接收数据包
			ds.receive(dp);
			// 4,读取包中的内容
			String ip = dp.getAddress().getHostAddress();
			// String name = dp.getAddress().getHostName();
			// int pot = dp.getPort();
			String txt = new String(dp.getData(), 0, dp.getLength());

			System.out.println(ip + ":::::" + txt);
			 ds.close();
		}
	}

}
</span>



发送端

<span style="font-size:14px;">package jinfulin.UDP.Demo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


public class UDPSendDemo {
	/*
	 * 需求:创建发送端并发送文字
	 * 思路:1,建立socket服务
	 * 		2,建立发送的数据
	 * 		3,将发送的数据封装在packet包中
	 * 		4,发送数据
	 * 		5,关闭
	 * 
	 */
	public static void main(String[] args) throws IOException {
		System.out.println("发送端已启动");
		//1,建立socket服务
		DatagramSocket ds = new DatagramSocket(8888);
		
		BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
		String line = null;
		while ((line = bufr.readLine()) != null)
		{
			//2,建立发送的数据
//			String str = "金福林";
//			byte[] buf = str.getBytes();
			byte[] buf = line.getBytes();
			//3,将发送的数据封装在packet包中
			DatagramPacket dp = new DatagramPacket(
					buf,buf.length,InetAddress.getByName("110.251.19.2"),12000);
			//,发送数据
			ds.send(dp);
			if("over".equals(line)){
				break;
			}
		}
		//5,关闭
		ds.close();
	}

}
</span>




 三、TCP传输


1、Socket与ServerSocket

1,Socket

Socket为套接字的意思,你也可以把它理解为插座或者港口。

套接字用于将应用程序与端口连接起来,是一个假想的连接装置。

技术分享



2,ServerSocket

ServerSocket表示服务器端的套接字,其主要功能是等待来着网络的请求,它可以通过制定的端口来等待连接的套接字。




2、服务器与客户端交互的过程

技术分享

a,服务端创建一个ServerSocket,调用accept()方法等待客户机。

b,客户机创建一个Socket请求与用户连接。

c,服务器接收客户端的请求,同时建立一个新的Socket与客户建立联系,服务器继续等待新的请求


3、示例(上传图片):

客户端

<span style="font-size:14px;">package jinfulin.TCP.Test.UpLoadPic;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;


/*
 * 上传图片的客户端
 */
public class UpLoadpicClient {
	//思路:
	//1,创建Socket(插座)
	//2,创建源:本地某个图片
	//3,创建目的:服务端
	//4,加缓冲区将写入流中
	//5,创建读取流
	//6,读取服务器返回的数据
	//7,关闭资源
	public static void main(String[] args) throws IOException {
		//1,创建Socket(插座)
		Socket s = new Socket("127.0.0.1", 8881);
		
		//2,创建源:本地某个图片
		FileInputStream pic = new FileInputStream("f:\\111.jpg");
		
		//3,创建目的:服务端(输出流)
		OutputStream out = s.getOutputStream();
		BufferedOutputStream bufout = new BufferedOutputStream(out);
		//4,加缓冲区将写入流中
		BufferedInputStream bufIn = new BufferedInputStream(pic);
		int ch = 0;
		while((ch = bufIn.read()) != -1){
//			out.write(ch);
			bufout.write(ch);
		}
		//----告诉服务端这里已经写完
		s.shutdownOutput();
		
		//5,创建输入流
		InputStream in = s.getInputStream();
		//6,读取服务器返回的数据
		BufferedReader bufr =new BufferedReader(new InputStreamReader(in));
		String line = bufr.readLine();
		System.out.println(line);
		//7,关闭资源
		bufIn.close();
		bufr.close();
		pic.close();
		s.close();
		
	}

}
</span>

服务端

<span style="font-size:14px;">package jinfulin.TCP.Test.UpLoadPic;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class UpLoadpicServer {

	public static void main(String[] args) throws IOException {
		//1,创建服务端插座ServerSocket
		ServerSocket ss = new ServerSocket(8881);
		
		while(true){
			//2,获取客户端
			Socket s = ss.accept();
			new Thread(new UpLoadTask(s)).start();
		}

//		ss.close();
		
		
	}

}
</span>

服务端调用的方法

<span style="font-size:14px;">
package jinfulin.TCP.Test.UpLoadPic;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * @author 金福林
 *
 */
public class UpLoadTask implements Runnable {

	private Socket s;
	public UpLoadTask(Socket s) {
		super();
		this.s = s;
	}

	public void run() {
		try {
			//2.1获取ip地址,ip打印
			String ip = s.getLocalAddress().getHostAddress();
			String name = s.getLocalAddress().getHostName();
			System.out.println(ip + "....");
			
			//3,源:获取客户端发来的数据(输出流)
			InputStream in = s.getInputStream();
			
			//4,目的:将读取到的文件写入一个目录中
			File dir = new File("f:\\" + name);
			if(!dir.exists())
				dir.mkdirs();
			File file = new File(dir,"server.jpg");
			FileOutputStream fos = new FileOutputStream(file);
			//5,循环写入
			int ch = 0;
			BufferedInputStream bufIn = new BufferedInputStream(in);
			while((ch = bufIn.read()) != -1)
			{
				fos.write(ch);
			}
			//6,获取Socket的输出流,将"上传成功"返回给客户端
			OutputStream out = s.getOutputStream();
			out.write("上传成功!".getBytes());
			//7,关闭资源
			bufIn.close();
			fos.close();
			s.close();
		} catch (Exception e) {
			
		}			
	}
}
</span>


 四、URL类


类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

URL类可以解析客户端给服务端发的请求

常见方法

String getProtocol();//获取协议名称

String getHost();//获取主机名

int getPort();//获取端口号

String getFile();//获取URL文件名

String getPath();//获取此URL的路径部分

String getQuery();//获取此URL的查询部

举例:

<span style="font-size:14px;"><span style="white-space:pre">		</span>String str_url = "http://127.0.0.1:8080/myweb/1.html";
		
		URL url = new URL(str_url);
		InputStream in = url.openStream();
		
		byte[] buf = new byte[1024];
		int len = in.read(buf);
		
		String text = new String(buf,0,len);
		System.out.println(text);
		
		in.close();</span>


 五、最后


关于网络的知识还有很多,java主要就应用于web开发, 需要大家以后在实践中反复的练习。













java基础9:网络编程

原文:http://blog.csdn.net/jinfulin/article/details/44946815

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!