JAVA学习历程记录(十)
网络编程
网络概念
网络通信协议:连接和通信的规则,对数据的传输格式/传输速率/传输步骤做了统一的规定,通信双方必须同时遵守
目前应用最广泛的是TCP/IP协议,该协议层次结构如下:
TCP/IP协议层次 |
---|
应用层(主要负责应用程序的协议,例如HTTP协议等) |
如HTTP、FTP、DNS |
传输层(主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议) |
如TCP、UDP |
网络层(是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络) |
如IP、ICMP、IGMP |
链路层(定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤、网线提供的驱动) |
如驱动程序、接口 |
IP地址和端口号
IPv4:由4个字节大小的二进制数来表示IP地址
IPv6:由16个字节表示IP地址
端口号:区分不同的不同的应用程序,取值范围是0~65535
DNS解析服务器:将域名和IP地址进行转换
套接字Socket:通过网络进行数据传输的机制,本质上就是一套基于网络的流
UDP协议
概述
是无连接通信协议,UDP在传输时,发送端不会确认接收端是否存在,接收端收到数据时,也不会向发送端反馈是否收到数据
通常用于音频视频和普通数据的传输
在传输数据时要求对数据进行分包,每个包大小不能超过64k大小
练习
双人聊天室
package chat;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Recive implements Runnable {
private DatagramPacket dp;
private DatagramSocket ds;
@Override
public void run() {
try {
ds = new DatagramSocket(8888);
} catch (SocketException e) {
e.printStackTrace();
}
dp = new DatagramPacket(new byte[1024], 1024);
while (true) {
try {
ds.receive(dp);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(dp.getAddress().getHostAddress()+ ":" + new String(dp.getData(),0, dp.getLength()));
}
}
}
package chat;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class Send implements Runnable {
@Override
public void run() {
DatagramSocket ds = null;
try {
ds = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
Scanner sc = new Scanner(System.in);
while (true) {
String list = sc.next();
byte[] by = list.getBytes();
DatagramPacket dp = null;
try {
dp = new DatagramPacket(by, by.length, InetAddress.getByName("192.168.1.148"), 8090);
} catch (UnknownHostException e) {
e.printStackTrace();
}
try {
ds.send(dp);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package chat;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException{
new Thread(new Send()).start();
new Thread(new Recive()).start();
}
}
TCP协议
TCP协议时面向连接的通信协议,它提供了两台计算机之间可靠无差别的数据传输,每次连接的创建都需要经过“三次握手”
第一次握手:客户端向服务器端发出连接请求,等待服务器确认
第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求
第三次握手:客户端再次向服务器端发送确认信息,确认连接
传输时不限制大小
TCP通信
联系
传输文件
package copy1;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class User {
public static void main(String[] args) throws IOException {
Socket s = new Socket("localhost",4645);
OutputStream os = s.getOutputStream();
File file = new File("");
byte[] fname = file.getName().getBytes();
os.write(fname.length);
os.write(fname);
FileInputStream fis = new FileInputStream(file);
byte[] bys = new byte[1024];
int len;
while ((len = fis.read(bys)) != -1){
os.write(bys,0,len);
}
s.shutdownOutput();
fis.close();
s.close();
}
}
package copy1;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Service {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket();
Socket s = ss.accept();
InputStream is = s.getInputStream();
byte i = (byte) is.read();
byte[] filename = new byte[i];
is.read(filename);
FileOutputStream fos = new FileOutputStream("E:\\" + new String(filename));
byte[] bys = new byte[1024];
int len;
while ((len = is.read(bys)) != -1){
fos.write(bys,0,bys.length);
}
s.shutdownOutput();
fos.close();
ss.close();
}
}