关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、概述
注:以前软考的时候总结过一篇关于网络的基本知识,大家可以参考一下http://blog.youkuaiyun.com/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开发, 需要大家以后在实践中反复的练习。