关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
注:以前软考的时候总结过一篇关于网络的基本知识,大家可以参考一下http://blog.csdn.net/jin870132690/article/details/41597135
只要接触过网络的人就不会不知道网络的重要性,网络编程指的是编写与其他计算机进行通信的程序。java已经将网络程序所需的东西封装成了不同的类。大大简化了我们的编程的难度。
网络模型包括OSI七层模型和TCP\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>
端口号用于识别不同的进程,有效端口号为0-65535,其中0-1024是系统使用或保留端口号,尽量不要使用
即通信规则,包含TCP和UDP协议
UDP是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。适用于一次只传送少量数据、对可靠性要求不高的应用环境
常用于UDP连接的比如说在线视频语音聊天等应用环境,对可靠性要求低,丢失一点数据也无所谓。
TCP是基于连接的协议,也就是说,在正式收发数据前,要进行三次握手,确保和对方建立可靠的连接。
TCP协议能为应用程序提供可靠的通信连接,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。
TCP协议一般用于文件传输、收发邮件等对数据准确性要求较高的活动。
a,通过DatagramSocket创建发送端
b,将要发送的数据封装在DatagramPacket包中
c,调用send方法发送。
a,通过DatagramSocket创建接收端
b,将受到的数据封装在DatagramPacket包中
c,通过recive接收包
接收端
<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>
Socket为套接字的意思,你也可以把它理解为插座或者港口。
套接字用于将应用程序与端口连接起来,是一个假想的连接装置。
ServerSocket表示服务器端的套接字,其主要功能是等待来着网络的请求,它可以通过制定的端口来等待连接的套接字。
a,服务端创建一个ServerSocket,调用accept()方法等待客户机。
b,客户机创建一个Socket请求与用户连接。
c,服务器接收客户端的请求,同时建立一个新的Socket与客户建立联系,服务器继续等待新的请求
客户端
<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类可以解析客户端给服务端发的请求
常见方法
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开发, 需要大家以后在实践中反复的练习。
原文:http://blog.csdn.net/jinfulin/article/details/44946815