概述
计算机网络:将不同地理区域的计算机(广义)通过通信线路(光纤)连接起来,通过功能完备的软件实现数据共享,信息传递。
网络编程 :使程序借助网络在不同计算机间传输数据。
Java提供的网络类库,可以实现网络连接 ,且Java支持网络传输。
2.网络通信要素
2.1 IP
网络中的计算机通过IP地址来进行寻找主机。
局域网ip(192.168.110)
广域网ip
打开cmd,输入命令:ipconfig,回车即可查看。
2.2 端口号
与计算机上的程序相对应,每个运行中的程序会分配一个端口号,不可重复。
端口号范围是0-65535,其中 0-1024被系统占用,定义时1024-65535。
2.3 通信协议
通信双方有一些约定,如何安全可靠的传输数据,速率,传输代码,出错控制等。
传输层协议中有两个重要的协议:
● 传输控制协议TCP(Transmission Control Protocol)
安全、可靠;
使用前,”三次握手“,必须测试网络是否通畅;
进行通信的两个应用进程:客户端——>服务端;
传输完成,释放已建立的连接,效率低;
断开时,“四次挥手“。
三次握手详解:
(1)Cilent端发送连接请求
(2)Server端接受连接后回复Ack报文,并向此次连接分配资源
(3)Client端接收到Ack报文后向Server端发生Ack报文,这样就建立了TCP连接。
图解:
举例详解:
总结:三次握手是要确认对方收到了自己的数据。若只有两次,客户端无回应,这会浪费服务端的资源。三次握手的2个重要功能:双方做好发送数据的准备工作;允许双方协商初始序列号。
四次挥手详解:
(1)Client发送一个FIN,来关闭Client到Server的数据传送
(2)Server接收到FIN后,发送一个ACK给Client
(3)Server发送一个FIN,来关闭Server到Client的数据传送
(4)Client收到FIN后,发送ACK给Server,完成四次挥手
举例详解:
客户端
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("127.0.0.1",55555);
OutputStream out=socket.getOutputStream();//获取输出流
DataOutputStream d=new DataOutputStream(out);
d.writeUTF("你好服务器");
//获取输入流对象
InputStream in =socket.getInputStream();
DataInputStream din=new DataInputStream(in);
System.out.println("来自服务端的消息:"+din.readUTF());
}
}
服务端
import java.io.*;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
//创建了一个服务器 端口为55555
ServerSocket server=new ServerSocket(55555);
System.out.println("服务器启动");
Socket socket=server.accept();//监听客户端是否连接了服务器,是阻塞式的
System.out.println("客户端连接成功"+socket);//socket就是连接到服务器的socket
//获取输入流对象
InputStream in=socket.getInputStream();
DataInputStream d=new DataInputStream(in);
System.out.println("来自客户端的信息:"+d.readUTF());
//获取输出流对象
OutputStream out=socket.getOutputStream();
DataOutputStream dout=new DataOutputStream(out);
dout.writeUTF("你好,找到客户端了!");
}
}
运行结果:
//服务端
服务器启动
客户端连接成功Socket[addr=/127.0.0.1,port=55402,localport=55555]
来自客户端的信息:你好服务器
//客户端
来自服务端的消息:你好,找到客户端了!
● 用户数据报协议UDP(User Datagram Protocol)
将数据、源、目标封装在一个数据包中;因无需连接,故不安全,发送成功与否都不知道;发送数据结束时不用释放资源,速度快。文章来源:https://uudwc.com/A/gVyno
import java.io.IOException;
import java.net.*;
public class Send {
public static void main(String[] args) throws IOException {
//负责发送和接收信息
DatagramSocket datagramSocket=new DatagramSocket();
while(true){
String s="你好,接收端";
DatagramPacket datagramPacket=new DatagramPacket(s.getBytes(),s.getBytes().length, InetAddress.getByName("127.0.0.1"),55555);
datagramSocket.send(datagramPacket);
}
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Receieve {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket=new DatagramSocket(55555);
byte[] b=new byte[1024];
DatagramPacket datagramPacket=new DatagramPacket(b,b.length);
datagramSocket.receive(datagramPacket);
String s=new String(datagramPacket.getData(),0,datagramPacket.getLength());
System.out.println(s);//你好,接收端
datagramSocket.close();
}
}
文章来源地址https://uudwc.com/A/gVyno