网络编程
网络编程
- 计算机网络:不同地理区域的计算机,通过通信线路互连成一个规模大、功能强的网络系统。
- 网络编程的目的:直接或间接的通过网络协议与其他计算机实现数据交换,进行通讯。
- 网络编程中有两个主要的问题:
- 如何准确的定位网络上的一台或多台主机,定位主机上特定的应用。
- IP
- 端口号
- 找到主机后如何可靠,高效的进行网络传输
- 网络通信协议
- 如何准确的定位网络上的一台或多台主机,定位主机上特定的应用。
- 网络编程的两个要素
- IP和端口号
- IP
- IP:唯一的标识Internet上的计算机(通信实体)
- 在java中使用InetAddress类表示
- IP分类:IPV4、IPV6|万维网、局域网(192.168.255.255-192.168.0.0)
- 域名:www.baidu.com、通过DNS域名解析服务器返回IP地址,然后访问对应的IP地址。
- 本地回路地址:127.0.0.1本机localhost
- 端口号
- 标识计算机上正在运行的程序
- 不同的进程有不同的端口号
- 16位二进制表示:0-65535
- 端口分类:
- 公认端口:0-1023。被预先定义的服务通信占用,HTTP:80、HTTPS:443、FTP:21、telnet:23
- 注册端口:1024-49151.分配给用户进程或应用程序。Tomcat:8080、mysql:3306、Oracle:1521
- 动态/私有端口:49152-65535
- 网络套接字Socket:端口号与IP地址的组合
- IP
- 网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)
- 概念:计算机网络中实现通信必须要有一些约定、即通讯协议,对速率、传输代码、代码结构、传输控制步骤、出错控制等制定标准。
- 传输层:
- TCP协议
- 使用TCP协议前,需要先建立TCP连接,形成传输数据通道
- 传输前,采用三次握手方式,点对点通信,是可靠的。
- TCP协议进行通信的两个应用程序:客户端、服务端
- 在连接中可以进行大数据量的传输
- 传输完毕,需要释放已经建立的连接,效率低
- UDP协议
- 将数据、源、目的封装成数据包,不需要建立连接
- 每个数据包的大小限制在64K内
- 发送不管对方是否准备好,接收方也不确认,故而是不可靠的
- 可以广播发送
- 发送结束时无需释放资源,开销小速度快
TCP示例
- TCP协议
- IP和端口号
//客户端
@Test
public void client() {
Socket socket = null;
OutputStream outputStream = null;
try {
InetAddress inet = InetAddress.getByName("10.138.93.75");
socket = new Socket(inet,8881);
outputStream = socket.getOutputStream();
outputStream.write("你好我是客户端".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if(socket!=null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//服务器
@Test
public void server(){
ServerSocket serverSocket =null;
ByteArrayOutputStream byteArrayOutputStream = null;
Socket socket = null;
InputStream inputStream = null;
try {
serverSocket = new ServerSocket(8881);
socket = serverSocket.accept();
inputStream = socket.getInputStream();
byteArrayOutputStream = new ByteArrayOutputStream();
//可能会有乱码
// byte[] bytes = new byte[16];
// int len;
// while ((len = inputStream.read(bytes))!=-1){
// System.out.print(new String(bytes,0,len));
// }
byte[] bytes = new byte[16];
int len;
while ((len = inputStream.read(bytes))!=-1){
byteArrayOutputStream.write(bytes,0,len);
}
System.out.println(byteArrayOutputStream.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (serverSocket!=null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(byteArrayOutputStream!=null){
try {
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(inputStream!=null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
UDP示例
//客户端
@Test
public void client(){
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket();
String data = "我是客户端";
byte[] bytes = data.getBytes();
InetAddress inetAddress = InetAddress.getLocalHost();
DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length,inetAddress,8899);
datagramSocket.send(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(datagramSocket!=null){
datagramSocket.close();
}
}
}
//服务器
@Test
public void server(){
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket(8899);
byte[] bytes = new byte[20];
InetAddress inetAddress = InetAddress.getLocalHost();
DatagramPacket datagramPacket = new DatagramPacket(bytes,0,bytes.length);
datagramSocket.receive(datagramPacket);
System.out.println(new String(datagramPacket.getData()));
} catch (IOException e) {
e.printStackTrace();
} finally {
if(datagramSocket!=null){
datagramSocket.close();
}
}
}