网络编程
2020-04-16 本文已影响0人
vv_64ce
网络编程中的两个主要问题:
1.如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
2.找到主机后如何可靠高效地进行数据传输
网络编程中的两个要素
1.对应问题一:IP和端口号
2.对应问题二:网络通信协议(TCP/IP参考模型)
3.通信要素一:IP和端口号
(1)IP:唯一的表示Intenet上的计算机
(2)在java中使用InetAddress类代表IP
(3)IP地址分为类方式一:IPV4和IPV6
IP地址分为类方式二:公网地址(万维网使用)和私有地址(局域网使用,即192.168开头,范围192.168.0.0~192.168.255.255)
4.域名: www.baidu.com
图片.png
5.本地回路地址:127.0.0.1
6.如何实例化InetAddress:getByName(String adress)、getLocalHost()
两个常用方法:getHostName() /getHostAddress()
InetAddress name = InetAddress.getByName("192.168.1.1");
System.out.println(name);///192.168.1.1
InetAddress name1 = InetAddress.getByName("www.baidu.com");
System.out.println(name1);//www.baidu.com/39.156.66.18
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);//DESKTOP-UCI6935/192.168.1.107
String hostName = localHost.getHostName();
String hostAddress = localHost.getHostAddress();
System.out.println(hostName + "....." + hostAddress);//DESKTOP-UCI6935.....192.168.1.107
7.端口号:标识计算机上运行的进程(程序)
8.端口号和IP地址组合得出一个网络套接字:Socket
图片.png
三次握手和四次挥手(都针对客户端)
三次握手四次挥手 TCP和UDP协议
TCP例题:
1.客户端发送内容到服务器,服务器将内容打印到控制台
/*
服务器端要处于启动状态
* 客户端发送内容到服务器,服务器将内容打印到控制台
* */
@Test
public void client() throws IOException {
//1.创建客户端连接,输入相应的ip地址和端口号(即服务器)
Socket server = new Socket("127.0.0.1",8899);
//2.将内容写入客户端
OutputStream outputStream = server.getOutputStream();
outputStream.write("你好".getBytes());
outputStream.close();
server.close();
}
@Test
public void server() throws IOException {
//1.创建服务器端连接,客户端通过服务器端的端口号进行连接
ServerSocket ss = new ServerSocket(8899);
//2.服务器端进行连接
Socket socket = ss.accept();
InputStream inputStream = socket.getInputStream();
// //方式一:
// int i;
// byte[] c = new byte[10];
// while ((i = inputStream.read(c)) != -1){
// String str = new String(c,0,i);
// System.out.println(str);
// }
//方式二:输出流的数据被写入一个byte数组,可通过toByteArray()和toString()获取数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i;
byte[] c = new byte[10];
while ((i = inputStream.read(c)) != -1){
baos.write(c,0,i);
System.out.println(baos.toString());
}
inputStream.close();
socket.close();
ss.close();
}
2.客户端发送文件到服务器,服务器将文件保存到本地
/*
* 客户端发送文件到服务器,服务器将文件保存到本地
* */
@Test
public void client() throws IOException {
String hostAddress = InetAddress.getLocalHost().getHostAddress();
Socket socket = new Socket(hostAddress,1234);
//客户端发送文件到服务器
OutputStream outputStream = socket.getOutputStream();
//发送的文件
FileInputStream fis = new FileInputStream(new File("1.txt"));
int i;
byte[] c = new byte[10];
while ((i = fis.read(c)) != -1){
outputStream.write(c,0,i);
}
fis.close();
outputStream.close();
socket.close();
}
@Test
public void server() throws IOException {
ServerSocket ss = new ServerSocket(1234);
Socket socket = ss.accept();
//服务器端获取文件
InputStream inputStream = socket.getInputStream();
//将文件保存到本地
FileOutputStream fos = new FileOutputStream(new File("socket.txt"));
int i;
byte[] c = new byte[10];
while ((i = inputStream.read(c)) != -1){
fos.write(c,0,i);
}
inputStream.close();
fos.close();
socket.close();
}
3.客户端发送文件到服务器,服务器保存到本地,并返回“发送成功”给客户端,并关闭相应连接
/*
* 客户端发送文件到服务器,服务器保存到本地,并返回“发送成功”给客户端,并关闭相应连接
* */
@Test
public void client() throws IOException {
Socket socket = new Socket("127.0.0.1",1245);
//将文件发送到服务器端
//客户端发送文件到服务器
OutputStream outputStream = socket.getOutputStream();
//读取出发送的文件
FileInputStream fis = new FileInputStream(new File("1.txt"));
int i;
byte[] c = new byte[10];
while ((i = fis.read(c)) != -1){
outputStream.write(c,0,i);
}
//关闭数据输出//
socket.shutdownOutput();
//3.获取到服务器发送的“发送成功”
InputStream inputStream = socket.getInputStream();
int x;
byte[] b = new byte[10];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((x = inputStream.read(b)) != -1){
baos.write(b,0,x);
}
System.out.println(baos.toString());
inputStream.close();
fis.close();
outputStream.close();
socket.close();
}
@Test
public void server() throws IOException {
ServerSocket ss = new ServerSocket(1245);
Socket socket = ss.accept();
//服务器端获取文件
InputStream inputStream = socket.getInputStream();
//将文件保存到本地
FileOutputStream fos = new FileOutputStream(new File("socket.txt"));
int i;
byte[] c = new byte[10];
while ((i = inputStream.read(c)) != -1){
fos.write(c,0,i);
}
//3.给客户端发送接收成功
OutputStream outputStream = socket.getOutputStream();
outputStream.write("消息接收成功".getBytes());
outputStream.close();
inputStream.close();
fos.close();
socket.close();
}
UDP举例
/*
* UDP发送数据
* */
@Test
public void send() throws IOException {
//建立UDP连接
DatagramSocket ds = new DatagramSocket();
String str = "真开心";
byte[] bytes = str.getBytes();
//打包传送的数据
DatagramPacket dp = new DatagramPacket(bytes,0,bytes.length,InetAddress.getLocalHost(),2222);
//发送数据
ds.send(dp);
ds.close();
}
@Test
public void receive() throws IOException {
//建立UDP连接
DatagramSocket ds = new DatagramSocket(2222);
byte[] bytes = new byte[10];
//打包接收的数据
DatagramPacket dp = new DatagramPacket(bytes,0,bytes.length);
//接收数据
ds.receive(dp);
System.out.println(new String(dp.getData(),0,dp.getLength()));
ds.close();
}
URL编程
URL:统一资源定位符,表示Internet上某一资源的地址
结构组成:http://localhost:8080/example/beaut.jpg?username=xx
协议 主机名 端口号 资源地址 参数列表