目录
网络编程概述
概述:Java提供的网络类库,可以实现网络连接,联网的底层细节被隐藏在
Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个
跨平台的网络库,程序员面对的是一个统一的网络编程环境
计算机网络:把分布在不同地理位置的具有独立功能的计算机,通过通信线路连接起来,能够实现资源传递共享
网络编程:使用计算机语言开发软件,让软件能够通过网络进行数据交换
目的:直接或间接地通过网络协议与其它计算机进行通讯
核心问题:
1.如何精确的找到计算机网络中的目标主机
IP+端口:找到某台主机+找到主机上的某个程序
2.找到后如何安全可靠的传输数据协议
对传输的速率,代码结构(报文),出错的解决办法等内容进行约定
网络模型
网络通信要素
IP:指互联网协议地址,又译为网际协议地址.网络中的计算机使用IP地址来进行唯一标识
端口:计算机中的应用程序的一个整数数字标号,用来区分不同的应用程序
通信协议:计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、 传输控制步骤、出错控制等制定标准
TCP:传输控制协议
1.安全可靠的传输协议
2.每次传输数据时,光与服务器建立连接(三次握手)
3.保证网络通畅,然后在进行数据传输
4.断开时进行四次挥手,保证客户端和服务器端都知情
5.因为要建立连接,所以传输较UDP慢
UDP:用户数据报协议
1.不需要建立网络连接
2.将数据,源,目标封装在数据包中
3.进行发送,发送是否成功,不知道
4.不建立连接,速度快,但是不安全
TCP编程
Socket常用方法:
public class Client {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("192.168.31.102",9965);//服务器IP+地址
OutputStream out=socket.getOutputStream();//输出,将所有的文字转换成字节进行交流
out.write("你好!".getBytes("utf-8"));//将所有的字符输出”utf-8“,编码
socket.close();
}
}
客户端工作过程:
1.创建Socket
2.打开连接到Socket的输入、输出流
3.按照一定的协议对Socket进行读/写的操作
4.关闭Socket
服务器工作过程:
1.调用ServerSocket(int port):创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求
2.调用accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象
3.调用该Socket类对象的getOutputStream()和getOutputStream()和getInputStream():获取输出流和输入流,开始网络数据的发送和接收
4.关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字
ServeSocket常用方法:
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);//接口
System.out.println("服务器启动成功,等待客户端连接");//
Socket socket=serverSocket.accept();//接收客户端信息
System.out.println("客户端连接成功!");
InputStream in=socket.getInputStream();//输入流,把文字转换成字节进行交流
OutputStream out=socket.getOutputStream();//输出流
byte[] b=new byte[100];//将所有的字节存入数组
int size=in.read(b);//读取数组的长度
String s=new String(b,0,size,"utf-8");//将数组里面的字节转换成字符串
System.out.println("客户端说"+s);//输出所有的字符串,客户端说的
out.write("你好!".getBytes("utf-8"));//向客户端输出
// System.out.println("端口已被占用");
}
}
UDP编程
发送端:
public class send {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket=new DatagramSocket(9999);
byte[]b="你好接收端".getBytes("utf-8");
DatagramPacket datagramPacket=new DatagramPacket(b,b.length, InetAddress.getByName("127.0.0.1",9999));
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
接受端:
public class Receive {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket=new DatagramSocket();
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);
}
}