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开发, 需要大家以后在实践中反复的练习。
- java基础9:网络编程
- JAVA网络编程基础
- Java网络编程基础
- java网络编程基础
- Java网络编程基础
- Java基础网络编程
- Java网络编程基础
- java基础<网络编程>
- java网络编程基础
- Java网络编程基础
- java基础:网络编程
- Java基础:网络编程
- 【java】网络编程基础
- java网络编程基础
- java网络编程基础
- Java基础--网络编程
- Java 网络编程基础
- Java基础:网络编程
- 图文混排
- Ubuntu1404设置静态ip
- 个人的关键作用——首领
- GOF23设计模式之享元模式的实现
- 计算组合数
- java基础9:网络编程
- nginx+apache+mysql+php+memcached+squid搭建集群web环境
- 机房收费系统重构版:照葫芦画瓢
- Android布局
- python元组
- 循环队列
- Java代码 求二叉树的深度
- Arduino网上学习资源
- 【万里征程——Windows App开发】SemanticZoom视图切换