今天目标---- 网络编程
1、了解网络概念
2、套接字(socket)编程
3、UDP
4、TCP
网络:
网络模型:
端口:
OS中共有65535个端口
|-- 固定端口(前1024)
|-- 动态端口
IP地址:
作用:
分类:
常见的IP:
子网掩码:
作用:
socket对象
java.net包
TCP:
TCP/IP协议簇中的重要协议
点对点,安全可靠的协议
UDP(User Datagram Protocol):
TCP/IP协议簇中的重要协议,用户数据报协议
特点:无连接、不安全、不可靠的协议,速度快
网络知识普及
Socket编程|套接字编程
TCP|UDP
java.net
服务器套接字:
客户端套接字:
socket简介:
⽹络中进程间通信
⾸要解决的问题是如何唯⼀标识⼀个进程,否则通信⽆从谈起!在本地可以通过进程PID来唯⼀标识⼀个进程,但是在⽹络中这是⾏不通的。
其实TCP/IP协议族已经帮我们解决了这个问题,⽹络层的“ip地址”可以唯⼀标识⽹络中的主机,⽽传输层的“协议+端⼝”可以唯⼀标识主机中的应⽤程序(进程)。
这样利⽤ip地址,协议,端⼝ 就可以标识⽹络的进程了,⽹络中的进程通信就可以利⽤这个标志与其它进程进⾏交互。这个就是网络编程,又称为socket编程。
什么是socket:
socket(简称套接字)是进程间通信的⼀种⽅式,它与其他进程间通信的⼀个主要不同是--它能实现不同计算机间的进程间通信,我们⽹络上各种各样的服务⼤多都是基于Socket来完成通信的。
例如我们每天浏览⽹⻚、QQ、微信、收发email等等……
创建socket:
在Java中使⽤java.net包中的类实现socket的创建:
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;
创建一个基于UDP协议的Socket对象
DatagramSocket ds = new DatagramSocket();
创建一个基于TCP协议的Socket客户端对象
Socket socket = new Socket(“127.0.0.1”, 8080);
创建一个基于TCP协议的Socket服务端对象
ServerSocket ss = new ServerSocket(8080);
创建⼀个tcp socket(TCP套接字):
import java.net.ServerSocket;
import java.net.Socket;
创建一个基于TCP协议的Socket客户端对象
Socket socket = new Socket(“127.0.0.1”, 8080);
创建一个基于TCP协议的Socket服务端对象
ServerSocket ss = new ServerSocket(8080);
创建⼀个tcp socket(UDP套接字)::
import java.net.DatagramSocket;
创建一个基于UDP协议的Socket对象
DatagramSocket ds = new DatagramSocket();
udp⽹络程序-发送数据:
创建⼀个udp客户端程序的流程是简单,具体步骤如下:
1、 创建客户端套接字
2、 发送/接收数据
3、 关闭套接字
实验代码:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class TestUDPSendData {
public static void main(String[] args) {
DatagramSocket ds = null;
try {
ds = new DatagramSocket(8888);
String str = "刘帅哥你很棒~~~";
DatagramPacket dp = new DatagramPacket(str.getBytes("gbk"), str.getBytes("gbk").length,
new InetSocketAddress("192.168.31.23", 8080));
ds.send(dp);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ds != null) ds.close();
}
}
}
udp⽹络程序-接受数据:
-不绑定IP地址和端口
接受数据存在两种情况,第一种就是我们默认不绑定IP地址和端口,有python解释器自动的为我们动态的分配:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class TestUDPSendData {
public static void main(String[] args) {
DatagramSocket ds = null;
try {
ds = new DatagramSocket();
String str = "刘帅哥你很棒~~~";
DatagramPacket dp = new DatagramPacket(str.getBytes("gbk"), str.getBytes("gbk").length,
new InetSocketAddress("192.168.31.23", 8080));
ds.send(dp);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ds != null) ds.close();
}
}
}
绑定IP地址和端口:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class TestUDPSendData {
public static void main(String[] args) {
DatagramSocket ds = null;
try {
ds = new DatagramSocket(new InetSocketAddress("192.168.31.23", 2233));
String str = "刘帅哥你很棒~~~";
DatagramPacket dp = new DatagramPacket(str.getBytes("gbk"), str.getBytes("gbk").length,
new InetSocketAddress("192.168.31.23", 8080));
ds.send(dp);
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ds != null) ds.close();
}
}
}
udp⽹络通信过程:
Tcp:
tcp通信模型:
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTcp {
public static void main(String[] args) {
ServerSocket ss = null;
PrintWriter out = null;
try {
ss = new ServerSocket(8888);
System.out.println(“等待客户端连接上来……”);
while(true) {
Socket socket = ss.accept();
System.out.println(socket.getInetAddress().getHostAddress() +"连接上来了");
// 注意PrintWriter第二个参数,必须为true,否则会缓冲数据,导致数据无法发送
out = new PrintWriter(socket.getOutputStream(), true);
out.println("欢迎访问本系统");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
控制台处于等待连接状态,等待客户端连接。
我们使用网络助手完成一次连接:
Tcp客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
Socket s = null;
BufferedReader br = null;
try {
s = new Socket("192.168.31.23", 8888);
// s = new Socket(“127.0.0.1”, 8888);
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(br.readLine());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}