网络编程TCP/UDP
网络编程
小结:
1.网络编程中有两个主要的问题
- 如何准确的定位到网络上的一台或多台主机
- 找到主机后如何进行通信
2.网络编程中的要素
- ip和端口号
- 网络通信协议 udp;tcp
3.万物皆对象
IP地址
- InetAddress不能new(没有构造器)只能同过静态方法来返回(InetAddress.getByName("localhost");)
通信协议
协议:约定 ,就好比我们现在说的普通话
网络通信协议:速率 传输码率 代码结构 传输控制…
问题:非常的复杂
大事化小:分层
TCP/IP协议簇实际上是一组协议
重要:
- TCP:用户传输协议
- UDP:用户数据报协议
出名的协议:
- TCP:
- IP:网络互连协议
TCP和UDP对比
TCP:打电话
-
连接,稳定
-
三次握手 四次挥手
-
最少需要三次 保持稳定连接! A:你愁啥 B:瞅你咋地 A:干一架吧! A:我要走了 B:你真的要走了吗 B:你真的真的要走了吗 A:嗯呢 拜拜 -
客户端 服务端
-
传输完成 释放连接 效率低
UDP:发短信
- 不连接 不稳定
- 客户端 服务端 没有明确的界限
- 不管有没有准备好 都可以发给你
- 导弹
- DDOS: 洪水攻击 (饱和攻击)
TCP实现聊天
注意:要先运行服务端哦~
客户端
1.连接服务器Socket
2.发送消息
服务端
1.建立服务的端口 ServerSocket
2.等待用户的连接 accept
3.接收用的消息
客户端
- 连接服务器Socket
- 发送消息
package lesson2;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
/*
客户端
*/
public class TCPClientDemo1 {
public static void main(String[] args) {
Socket socket = null;
OutputStream outputStream = null;
try {
//1.要知道服务器的地址
InetAddress severIP = InetAddress.getByName("127.0.0.1");
//端口号
int port = 9999;
//2.创建一个socket连接
socket = new Socket(severIP,port);
//3.发送消息
outputStream = socket.getOutputStream();
outputStream.write("xiaoqi".getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
e.printStackTrace();
}finally {
if (outputStream!= null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务器
- 建立服务端口SeverSocket
- 等待用户的连接accept()
- 接收用户消息
package lesson2;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
服务端
*/
public class TCPSeverDemo2 {
public static void main(String[] args) {
ByteArrayOutputStream bos = null;
InputStream inputStream =null;
Socket socket = null;
ServerSocket serverSocket = null;
try {
//1.我的有一个地址
serverSocket = new ServerSocket(9999);
while(true) {
//2.等待客户端连接进来
socket = serverSocket.accept();
//3.读取客户端的消息
inputStream = socket.getInputStream();
/*在传输的过程中,可能会出现问题
byte[] bytes = new byte[1024];
int len;
while((len = inputStream.read(bytes)) != -1){
String s = new String(bytes,0,len);
System.out.println(s);
}*/
//管道流
bos = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int len;
while ((len = inputStream.read(bytes)) != -1) {
bos.write(bytes, 0, len);
}
System.out.println(bos.toString());
}
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭资源
if (bos!=null){
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (serverSocket!= null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
初识Tomcat
Tomcat
服务端
- 自定义S
- Tomcat服务器S:java后台开发
客户端 - 自定义C
- 浏览器B
UDP消息发送
发短信:不用连接,需要知道对方的地址
循环发送:
发送方:
package lesson3;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UdpSendDemo01 {
public static void main(String[] args) throws Exception{
DatagramSocket socket = new DatagramSocket(8888);
// 准备数据:控制台读取
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while(true) {
String data = reader.readLine();
byte[] buffer = data.getBytes();
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length, new InetSocketAddress("localhost", 6666));
// 发送包
socket.send(packet);
if (data.equals("bye")) {
break;
}
}
// 关闭socket
socket.close();
}
}
接受方:
package lesson3;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceiveDemo01 {
public static void main(String[] args) throws Exception{
// 开放端口
DatagramSocket socket = new DatagramSocket(6666);
while (true) {
// 准备接收包裹
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container, 0, container.length);
socket.receive(packet);
byte[] data = packet.getData();
String receiveData = new String(data,0,packet.getLength());
System.out.println(receiveData);
if (receiveData.equals("bye")) {
break;
}
}
// 关闭socket
socket.close();
}
}
URL
- https://www.baidu.com
- 统一资源定位符:定位互联网上的某一个资源
- DNS域名解释 :就是把域名www.baidu.com 解析成—>IP xxx.xxx.xxx.xx.x.x
- URL组成(协议:// ip地址:端口号/项目名/资源)
下载文件
-
1.启动tomcat服务器;
-
2.在tomcat中放好文件;
-
3.进行相关测试。
-
package com.fjbc.网络编程; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class URLDown { public static void main(String[] args) throws Exception{ // 1.下载地址 URL url = new URL("\thttps://imgessl.kugou.com/stdmusic/20210817/20210817174303365835.jpg"); // 2.连接到这个资源 HTTP HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); InputStream is = urlConnection.getInputStream(); FileOutputStream stream = new FileOutputStream(new File("one.jpg")); byte[] bytes = new byte[1024]; int len = 0; while ((len = is.read(bytes)) != -1){ stream.write(bytes,0,len); } stream.close(); is.close(); urlConnection.disconnect(); } }
浙公网安备 33010602011771号