网络编程概述
计算机网络:
把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路 连接起来,由功能完善的软件实现资源共享和信息传递的系统
网络编程:
在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换
网络通信要素:
IP:要想让网络中的计算机能够 互相通信,必须为每台计算机指定一个标识号, 通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而P地址就是这个标识号
端口号:来区分不同的应用程序
通信协议:通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守定的规则,对速率、传输代码、代码结构等进行约定
ip地址
IPv4、IPv6
TCP和UDP协议各自特征
TCP:
(1)TCP是面向连接(虚连接)的传输层协议,每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的。
(2)TCP提供可靠交付的服务,无差错、不丢失、不重复、按序到达。
(3)TCP提供全双工通信。
发送缓存:准备发送的数据或者已发送但尚未收到确认的数据。
接收缓存:按序到达但尚未被接受应用程序读取的数据或者不按序到达的数据。
(4)TCP面向字节流。
UDP:
1、无连接的传输层协议;
2、可靠性差,速度快
3、面向报文,对应用层交下来的报文,不拆分,不合并,保留报文边界;
4、支持一对一,一对多,多对多通信;
5、没有拥塞控制,即使出现拥塞也不会降低发送速率;
6、首部开销小,只有8字节;
三次握手与四次挥手
TCP编程
客户端程序:
public class Client {
public static void main(String[] args) throws IOException {
//创建客户端socket,创建时就会连接服务器,检查网络是否通畅
Socket socket = new Socket("127.0.0.1",6549);
while(true) {
DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream());
Scanner sc = new Scanner(System.in);
String s = sc.next();
dataOut.writeUTF(s);
DataInputStream datain = new DataInputStream(socket.getInputStream());
System.out.println("服务器说:" + datain.readUTF());
}
}
}
服务器端程序:
package com.ffyc.javanet.demo1;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
public static void main(String[] args) throws IOException {
//创建服务器
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务器启动成功,等待客户端连接");
//监听客户端连接
Socket s = serverSocket.accept();//监听是阻塞式的
System.out.println("客户端连接成功");
/*
接收客户端发送的消息
*/
while (true) {
DataInputStream datain = new DataInputStream(s.getInputStream());
String msg = datain.readUTF();
System.out.println("客户端说:" + msg);
/*
向客户端回复信息
*/
DataOutputStream dataOut = new DataOutputStream(s.getOutputStream());
Scanner sc = new Scanner(System.in);
String ss = sc.next();
dataOut.writeUTF(ss);
}
}
}
UDP编程
接收端
public class Receive {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] b = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(b,b.length);
datagramSocket.receive(datagramPacket);
String msg = new String(datagramPacket.getData(),0,datagramPacket.getLength(), "utf-8");
System.out.println(msg);
}
}
发送端:
public class Send {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket();
byte[] b="你好接收端".getBytes("utf-8");
DatagramPacket datagramPacket = new DatagramPacket(b,b.length, InetAddress.getByName("127.0.0.1"),9999 );
datagramSocket.send(datagramPacket);
}
}