网络编程!=网站编程
1.网络基础
什么是计算机网络
计算机网络,是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
计算机网络的主要功能
1.主要目的:共享资源
2.扩大共享资源的地理范围
3.分布式控制提高可靠性
4.促进分布式数据处理和数据库的发展
5.提供各种通信服务
6.提高可扩充性
什么是网络通信协议
计算机网络中实现通信必须要有一些约定即通信协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
网络通信接口
为了使两个节点之间能进行对话、必须在他们之间建立通信工具(即接口),使彼此之间能进行信息交换。接口包括两部分:
硬件装置:实现节点之间的信息传送
软件装置:规定双方进行通信的约定协议
2.通信协议分层的思想
为什么要分层
由于节点之间联系很复杂,在制定协议时,把复杂成分分解成一些简单的成分,再将他们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。
通信协议的分层规定
把用户应用程序作为最高层,把物理通信线路作为最低层,将其间的协议处理分为若干层,规定每层处理的任务,也规定每层的接口标准。
TCP/IP参考模型
3.IP地址
4.TCP/UDP
TCP和UDP协议
TCP(transmission control protoccl)是专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。它是一种面向有连接的协议。TCP连接是字节流而非报文流。
UDP(user data protocol)UDP向应用程序提供了一种发送封装的原始IP数据报的方法,并且发送时无需建立连接,是一种不可靠的连接。
5.TCP/UDP程序的写法(流的运用)
5.1TCP
Socket
两个Java程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。
Socket通常用来实现client-server连接。
Java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的client端和server端
建立连接时所需的寻址信息为远程计算机的IP地址和端口号(port number)
TCP端口 UDP端口分开的
每一个有65536个端口
TCPServer
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* TCP Socket 通信
* 服务器,先运行服务器端
* */
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(6666);
while(true) {
Socket s = ss.accept(); //accept()阻塞式 等待连接
System.out.println("server:A client connect!");
InputStream is = s.getInputStream(); //从客户端读取信息
DataInputStream dis = new DataInputStream(is);
String s1 = null;
if((s1=dis.readUTF())!=null) {
System.out.println(s1); //readUTF()阻塞式
}
System.out.println("server:from:"+s.getInetAddress()+"port:"+s.getPort());
OutputStream os = s.getOutputStream(); //给客户端发信息
DataOutputStream dos =new DataOutputStream(os);
dos.writeUTF("server:hi");
dos.flush();
dis.close();
dos.close();
s.close();
}
}
}
/*
server:A client connect!
client:Hello server!
server:from:/127.0.0.1port:1957
*/
TCPClient
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* TCP Socket 通信
* 客户端
* 端口随机选用
* 先起服务端再起客户端
* */
public class TCPClient {
public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
Socket s = new Socket("127.0.0.1",6666); //本地6666端口
OutputStream os = s.getOutputStream(); //给服务器发信息
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("client:Hello server!");
dos.flush();
InputStream is = s.getInputStream(); //从服务器接收信息
DataInputStream dis = new DataInputStream(is);
String s1 = null;
if((s1=dis.readUTF())!= null) {
System.out.println(s1);
}
dos.close();
dis.close();
s.close();
}
}
/*
server:hi
*/
5.2UDP
不可靠、效率高、数据报/非连接 音频、视频…
UDPS
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDPS {
public static void main(String[] args) throws IOException {
byte[] buf = new byte[1024];
//数据报包用来实现无连接包投递服务
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//监听UDP5678端口 ,接收数据报包
DatagramSocket ds = new DatagramSocket(6666);
while(true) {
ds.receive(dp); //阻塞式方法
System.out.println(new String(buf,0,dp.getLength()));
}
}
}
/*
hello
*/
UDPC
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UDPC {
public static void main(String[] args) throws IOException {
byte[] buf = (new String("hello")).getBytes();//将一个字符串转换为字节数组
DatagramPacket dp = new DatagramPacket(buf,buf.length,
new InetSocketAddress("127.0.0.1",6666));//指明数据报包传送的目的地址
DatagramSocket ds = new DatagramSocket(9999);
ds.send(dp);
ds.close();
}
}
将lang类型转换为字节数组
UDPS
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPS {
public static void main(String[] args) throws IOException {
byte[] buf = new byte[1024];
//数据报包用来实现无连接包投递服务
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//监听UDP5678端口 ,接收数据报包
DatagramSocket ds = new DatagramSocket(6666);
while(true) {
ds.receive(dp); //阻塞式方法
ByteArrayInputStream bis = new ByteArrayInputStream(buf);//对接收的字节数组进行处理
DataInputStream dis = new DataInputStream(bis);
System.out.println(dis.readLong());
}
}
}
UDPC
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UDPC {
public static void main(String[] args) throws IOException {
long n = 10000L;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeLong(n);
byte[] buf = baos.toByteArray();
DatagramPacket dp = new DatagramPacket(buf,buf.length,
new InetSocketAddress("127.0.0.1",6666));//指明数据报包传送的目的地址
DatagramSocket ds = new DatagramSocket(9999);
ds.send(dp);
ds.close();
}
}
总结:
网络协议分层思想
IP的概念
TCP/UDP的概念
TCP/UDP程序的写法
知识点的融会贯通+流的运用