java基础9:网络编程

来源:互联网 发布:蒙泰软件官方网站 编辑:程序博客网 时间:2024/06/05 11:23

关于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,创建服务端插座ServerSocketServerSocket 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开发, 需要大家以后在实践中反复的练习。













2 0
原创粉丝点击