网络编程
1、网络通讯要素
1. IP地址:InetAddress
网络中设备的标识。
不易记忆,可用主机名。
本地回环地址:127.0.0.1 主机名:localhost。
2.IPV4数量已经不够分配,所以产生了IPV6。
3.在没有连接互联网的情况,为了让访问本机方便,所以分配了一个默认的IP地址,也就是本地回环
地址。
4.通过ping 127.0.0.1可以测试网络是不是通,如果不通,可能是网卡出问题了。
2、端口号
用于标识进程(应用程序)的逻辑地址,不同进程的标识。
有效端口:0~65535,其中0~1024系统使用或保留端口。
P.S.
1、当一台计算机A向另一台计算机B发送QQ信息时,首先路由器通过数据包中的IP地址定位该信息发
送到哪一台机器。然后计算机B接收到数据包后,通过此数据包中的端口号定位到发送给本机的QQ应用
程序。
2、所谓防火墙,其功能就是将发送到某程序端口的数据屏蔽掉以及将从该程序端口发出的数据也屏蔽
掉。
3. 传输协议
通讯的规则。
常见协议:UDP、TCP。
UDP的特点:
将数据及源和目的封装成数据包中,不需要建立连接。
每个数据报的大小限制在64k内。
因无连接,是不可靠协议。
不需要建立连接,速度快。
应用案例:QQ、FeiQ聊天、在线视频用的都是UDP传输协议。
TCP的特点:
建立连接,形成传输数据的通道。
在连接中进行大数据量传输。
通过三次握手完成连接,是可靠协议。
必须建立连接,效率会稍低。
应用案例:FTP,File Transfer Protocol(文件传输协议)。
P.S.
InetAddress类中有一个静态方法:static InetAddress[] getAllByName(String host),此方法是在给
定主机名的情况下,根据系统上配置的名称服务返回其IP地址所组成的数据。这是由于有些主机名对应的
IP地址不唯一,如新浪、百度,都是服务器集群。
域名解析,最先走是本地的hosts(C:\WINDOWS\system32\drivers\etc\hosts)文件,解析失败
了,才去访问DNS服务器解析、获取IP地址。
应用:通过hosts文件可以屏蔽游戏网站内容弹出,例如:在hosts文件中添加,127.0.0.1
www.game18.com。
4、UDP协议-发送端&接收端
Socket
Socket就是为网络服务提供的一种机制。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
UDP传输
DatagramSocket(用来发送和接收数据报包的套接字)与DatagramPacket(数据报包)。
建立发送端,接收端。
建立数据包。
调用Socket的发送接收方法。
关闭Socket。
发送端与接收端是两个独立的运行程序。
——————————————————————————————————————————————————————————————————————————————————————————
UDP通讯演示:
package udp.communication;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Receive {
public static void main(String[] args) throws IOException {
// 建套接字对象
DatagramSocket ds = new DatagramSocket(10086);
// 建包对象
DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
// 解析数据包
while(true){
ds.receive(dp);
String line = new String(dp.getData(),0,dp.getLength());
System.out.println("from"+dp.getAddress().getHostAddress()+" :"+line);
}
}
}
package udp.communication;
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 Send {
public static void main(String[] args) throws IOException {
// 建立数据报对象
DatagramSocket ds = new DatagramSocket();
// 封装键盘录入信息
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
// 信息装包
while ((line = br.readLine()) != null) {
if("886".equals(line)){
break;
}
DatagramPacket dp = new DatagramPacket(line.getBytes(),
line.getBytes().length,InetAddress.getByName("192.168.31.248"),10086);
// 发送包
ds.send(dp);
}
// 释放资源
}
}
P.S.
由于UDP协议传输数据,只管发送数据,而不管接收端是否能够接收到数据。因此,应该首先启动接
收端程序,再启动发送端程序。
TCP协议-客户端&服务端
客户端(Client)首先与服务端(Server)建立连接,形成通道(其实就是IO流),然后,数据就可
以在通道之间进行传输,并且单个Server端可以同时与多个Client端建立连接。
Socket和ServerSocket,建立客户端和服务器端.
建立连接后,通过Socket中的IO流进行数据的传输。
关闭socket。
同样,客户端与服务器端是两个独立的应用程序。
TCP客户端
客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异
常。
连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已
经提供了输入流和输出流对象,通过getInputStream(),getOutputStream()获取即可。
与服务端通讯结束后,关闭Socket。
TCP服务端
服务端需要明确它要处理的数据是从哪个端口进入的。
当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与
客户端通过IO流进行数据传输。
当该客户端访问结束,关闭该客户端。
————————————————————————————————————————————————————————————————————————————
TCP演示
package tcp.communication;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Sender {
public static void main(String[] args) throws UnknownHostException,
IOException {
// 建立套接字对象
Socket s = new Socket("192.168.31.248", 10086);
// 获取输入流对象
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
// 封装键盘录入信息
String message = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader feedback = new BufferedReader(new InputStreamReader(is));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
while((message = br.readLine())!= null){
if("886".equals(message))
break;
bw.write(message);
bw.newLine();
bw.flush();
//接收反馈信息
System.out.println(s.getInetAddress().getHostAddress()+" ... "+feedback.readLine());
}
// 发送结束信息
s.shutdownOutput();
// 释放资源
s.close();
}
}
package tcp.communication;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Receiver {
public static void main(String[] args) throws IOException {
// 建立Socket对象
ServerSocket ss = new ServerSocket(10086);
// 监听链接
System.out.println("监听链接:");
System.out.println(!ss.isClosed());
// 获取输入流
Socket s = ss.accept();
// BufferedReader br = null;
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// 建立文本,追加形式
while (true) {
// 解析信息
System.out.println("等待消息:");
String line = br.readLine();
System.out.println(s.getInetAddress().getHostAddress() + " :"
+ line);
// copyToTxt(line);//复制到文本
// 反馈信息
System.out.println("tcp是否关闭:"+s.isClosed());
if(!s.isClosed()){
OutputStream os = s.getOutputStream();
os.write("消息收到~~\r\n".getBytes());
}
}
}
private static void copyToTxt(String line) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("tcp.txt", true));
bw.write(line);
bw.newLine();
bw.close();
}
}
P.S.
TCP协议传输数据必须先开服务端,再开客户端。否则,客户端根本连接不上服务端。
———————————————————————————————————————————————————————————————————————————
6、 URL&URLConnection
URI:统一资源标示符。
URL:统一资源定位符,也就是说根据URL能够定位到网络上的某个资源,它是指向互联网“资
源”的指针。
每个URL都是URI,但不一定每个URI都是URL。这是因为URI还包括一个子类,即统一资源名称
(URN),它命名资源但不指定如何定位资源。
7、常见网络结构
1. C/S client/server
特点:
该结构的软件,客户端和服务端都需要编写。
开发成本较高,维护较为麻烦。
好处:
客户端在本地可以分担一部分任务。例如,杀毒软件直接对本机文件进行杀毒。
2. B/S browser/server
特点:
该结构的软件,只开发服务器端,不开发客户端,因为客户端直接由浏览器取代。
开发成本相对低,维护更为简单。
缺点:
所有运算都要在服务端完成。