JAVA网络编程入门
A.什么是网络编程
网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计这5部分你都要接触。
网络模型
网络模型:描述网络的结构原理和工作原理
OSI参考模型:七层
Internet网络模型:四层
网络协议:指定层上进行数据交换的规则。
Internet的网络层协议:IP协议;DNS协议(辅助协议)
套接字
套接字(Sockets):应用程序和网络协议的接口。
Java Sockets:Java应用程序和网络协议的接口,提供若干个类的定义。
Java应用程序利用这些类继承网络协议的行为,实现网络通信。
TCP Sockets:使用TCP协议实现可靠的网络通信。
UDP Sockets:使用UDP协议实现效率较高的网络通信。
ip
Internet Protocol简称IP,又译为网际协议或互联网协议,是用在TCP/IP协议簇中的网络层协议。IP协议位于TCP/IP协议的网络层,位于同一层次的协议还有下面的ARP和RARP以及上面的ICMP(Internet控制报文协议)和IGMP(Internet组管理协议)。除了ARP和RARP报文以外的几乎所有的数据都要经过IP协议进行传送。ARP和RARP报文没有封装在IP数据报中,而ICMP和IGMP的数据则要封装在IP数据报中进行传输。由于IP协议在网络层中具有重要的地位,TCP/IP协议的网络层又被称为IP层
获取本地主机的IP
package internet;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Inetaddress {
public static void main(String[] args) {
//查询本机的IP地址
try {
InetAddress inetAddress = InetAddress.getLocalHost();
InetAddress inetAddress1=InetAddress.getByName("192.168.10.1");
System.out.println(inetAddress);
System.out.println(inetAddress1);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
端口
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。
package internet;
import java.net.InetSocketAddress;
public class Inetscoketaddress {
public static void main(String[] args) {
InetSocketAddress inetSocketAddress = new InetSocketAddress("LAPTOP-3A806N38",8080);
InetSocketAddress inetSocketAddress1 = new InetSocketAddress("192.168.10.1", 8080);
System.out.println(inetSocketAddress);
System.out.println(inetSocketAddress1);
System.out.println(inetSocketAddress.getPort());//获取端口号
System.out.println(inetSocketAddress.getAddress());//获取地址
}
}
TCP/IP协议
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
TCP.写一个服务端
package internet;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SEVER {
public static void main(String[] args) {
ServerSocket serverSocket=null;
Socket socket=null;
InputStream is=null;
ByteArrayOutputStream baos=null;
try {
//建立服务器的IP和端口
serverSocket=new ServerSocket(9898);
socket=serverSocket.accept();//接收客户端的链接
is=socket.getInputStream();//读取客户端发送的东西
//管道流
baos = new ByteArrayOutputStream();
byte[] bytes=new byte[1024];
int len;
while ((len=is.read(bytes))!=-1){
baos.write(bytes,0,len);
}
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP写一个客户端:和服务端连接 发送消息、
package internet;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SEVER {
public static void main(String[] args) {
ServerSocket serverSocket=null;
Socket socket=null;
InputStream is=null;
ByteArrayOutputStream baos=null;
try {
//建立服务器的IP和端口
serverSocket=new ServerSocket(9898);
socket=serverSocket.accept();//接收客户端的链接
is=socket.getInputStream();//读取客户端发送的东西
//管道流
baos = new ByteArrayOutputStream();
byte[] bytes=new byte[1024];
int len;
while ((len=is.read(bytes))!=-1){
baos.write(bytes,0,len);
}
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
UDP数据包协议
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据报的方法。RFC 768 [1] 描述了 UDP。
Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的的事情。面向连接的是 TCP,该协议几乎做了所有的事情。 [2]
发送消息的代码
package internet;
import java.io.IOException;
import java.net.*;
public class UDP {
public static void main(String[] args) throws IOException {
//建立一个Socket
DatagramSocket socket = new DatagramSocket();
//建立一个包
String msg= "晚上好兄弟萌";
InetAddress inetAddress = InetAddress.getByName("LAPTOP-3A806N38");
int port =9999;
//定义一个数据包
DatagramPacket packet =new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,inetAddress,port);
//参数分别为 数据,数据的长度,接收端的网址,接收端的端口
socket.send(packet);//发送包
socket.close();//关闭流
}
}
接受消息的代码
package internet;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class RECVIE {
public static void main(String[] args) throws IOException {
//开放端口
DatagramSocket socket =new DatagramSocket(9999);
//接收数据包
byte [] bytes=new byte[1024];
DatagramPacket packet =new DatagramPacket(bytes,0,bytes.length);
socket.receive(packet);
System.out.println(packet.getAddress().getHostAddress());
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}
}