目录
网络编程
获取本机的IP地址的方法
1、协议定义:
UDP(User Datagram Protocol):用户数据报协议
TCP (Transmission Control Protocol):传输控制协议
2、UDP协议
UDP 协议发送给数据:
UDP协议接收数据
3、TCP协议
TCP服务器实现步骤
TCP客户端实现步骤
4、心得体会
慢慢体会啊啊啊啊,不要做自己欺骗自己的小傻子啊。每次学的东西都没入脑,第二天就忘了。路漫漫其修远兮,吾将上下而求索。
又称Socket编程,网络编程三要素(ip,port,协议(udp,tcp/ip))
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* @author wyd
* @date 2021/8/10
* 网络编程------>Socket编程
*
* 网络编程的三要素:
* ip:ip地址
* port:端口号
* 协议:
* udp协议
* 1)不需要建立连接通道
* 2)属于一种不可靠连接
* 3)发送文件大小限制的
* 4)执行效率高 (不同步的)
* TCP/Ip协议
* 1)建立连接通道
* 2)属于安全连接(可靠连接)
* 3)发送文件(使用基本字节流),相对udp协议来说没有限制
* 4)执行效率低(同步的)
*
* InetAddress:互联网ip地址
* 获取InetAddress:ip地址对象
* public static InetAddress getByName(String host):参数:主机名称(计算机电脑名称)
* public String getHostAddress():获取ip地址字符串形式
*
*/
public class NetDemo {
public static void main(String[] args) throws UnknownHostException {
//如何获取自己电脑上的ip地址
InetAddress inetAddress = InetAddress.getByName("DESKTOP-4KUN8QI");//主机名称
String ip = inetAddress.getHostAddress();
System.out.println(ip);//192.168.137.1
}
}
UDP概述:
UDP 是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。
UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象。因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念。Java提供了DatagramSocket类作为基于UDP协议的Socket。
1.TCP协议(传输控制协议)是面向连接的可靠的协议,是允许系统通过Internet进行通信的标准,它定义了如何建立和维护应用程序可以通过其交换数据的网络对话;保证了数据的传递,并保证数据包的发送顺序与发送数据包的顺序相同,是OSI层中的传输层协议,通过传输和确保通过支持网络和Internet传递消息来在远程计算机之间创建连接。
2.在明白TCP协议这个概念的前提下我们要想实现用Java程序来进行TCP编程其实不难,只需要我们理清相关概念:
ip:唯一的标识Internet上的某台计算机,在Java程序中通过InetAddress类获取IP
端口号:可以理解为正在计算机上运行的进程,不同的进程有不同的端口号
Socket:这是一个比较抽象的概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络。
发送处理过程:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* @author wyd
* @date 2022/07/30
*
* Udp编程的发送端:
* 1)创建Socket对象
* 2) 发送内容 : 内容数据一种数据报文(报包)DatagramPacket
* 3) 释放资源
*/
public class UdpSend {
public static void main(String[] args) throws IOException {
DatagramSocket ds = null;
try {
//1)创建Socket对象
ds = new DatagramSocket();
//2)创建一个数据报包对象DatagramPacket
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//参数1:当前数据的字节数组
//参数2:当前数据的长度
//参数3:InetAddress:ip地址对象
//参数4:绑定的端口号
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读取键盘输入流
String line;
while ((line = br.readLine()) != null) {
if ("886".equals(line))
break;
byte[] bys = line.getBytes();
int length = bys.length;
//public static InetAddress getByName(String host)
InetAddress inetAddress = InetAddress.getByName("192.168.137.1");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bys, length, inetAddress, port);//建立数据包,声明长度,接收端主机,端口号
//3)发送数据报包
//public void send(DatagramPacket p)
ds.send(dp);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//4)释放资源
ds.close();
}
}
}
接收处理过程
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* @author wyd
* @date 2022/07/30
*
* Udp接收端
* 1) 创建Socket对象
* 2) 创建一个接收容器 : 数据报包:DatagramPacket
* 3) 接收
* 4) 解析容器的的实际数据大小
* 5) 展示发送端发送的数据
*/
public class UdpReceive {
public static void main(String[] args) throws IOException {
try {
//)创建Socket对象
//public DatagramSocket(int port)
DatagramSocket ds = new DatagramSocket(10086);//接收端口号的消息
while (true) {
//2)创建一个接收容器:数据报包:DatagramPacket 实际数据没有这么大
//public DatagramPacket(byte[] buf, int length)
//自定义字节缓冲区
byte[] bytes = new byte[1024];
int lentgth = bytes.length;
DatagramPacket dp = new DatagramPacket(bytes, lentgth);//建立信息包
//3)public void receive(DatagramPacket p)
ds.receive(dp);
//4)解析实际数据
//byte[] getData() 获取实际字节数
//返回数据缓冲区。
//int getLength() 获取实际长度
byte[] bytes2 = dp.getData();
int length2 = dp.getLength();
String receiverStr = new String(bytes2, 0, length2);
System.out.println("输入的数据为:" + receiverStr);
//获取ip地址
//InetAddress getAddress()
//public String getHostAddress():
String ip = dp.getAddress().getHostAddress();
//展示数据
System.out.println("data from " + ip);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//接收不关闭
//接收socket对象一一直开着
}
}
}
1)创建服务器端的Socket对象
2)监听客户端连接
3)获取通道内的输入流
4)读取数据
import com.sun.security.ntlm.Server;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author wyd
* @date 2022/7/31
* 服务器端不断读取数据并展示
*/
public class ServerDemo {
public static void main(String[] args) {
//1.创建服务器端的ServerSocket,指明自己的端口号
ServerSocket ss = null;
try {
ss = new ServerSocket(10010);
while (true) {
System.out.println("服务器正在等待连接");
//2.调用accept表示监听客户端的socket
Socket socket = ss.accept();
//3.不断监听,不断展示数据,获取通道内的输入流(InputStream)
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader br = new BufferedReader(inputStreamReader);
//一次读取一行
String line = null;
while ((line = br.readLine()) != null) { //阻塞式方法
// //展示数据
System.out.println(line);
}
//4.获取ip
String ip = socket.getInetAddress().getHostAddress();
//展示数据
System.out.println("data from "+ip+" content is--->"+line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
1)创建TCP客户端的Socket对象
2)写数据
3)释放资源
import java.io.*;
import java.net.Socket;
/**
* @author wyd
* @date 2022/7/31
*
* TCP客户端不断键盘录入数据,服务器端不断接收数据,然后展示数据
*/
public class ClientDemo {
public static void main(String[] args) {
//创建客户端的Socket
Socket socket = null;
try {
//1.创建Socket对象,指明服务器IP和端口号
socket = new Socket("127.0.0.1", 10010);
//创建BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//读取一行
String line = null;
while ((line = br.readLine()) != null) {//null只是作为 一个文件是否读完
if ("over".equals(line)) {
break;
}
//2.获取一个输出流用于输出数据
OutputStream outputStream = socket.getOutputStream();
//3.写出数据的操作(这里也可以用转换流OutputStreamWriter)
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
BufferedWriter bw = new BufferedWriter(outputStreamWriter);
//给封装的通道内的流对象bw写一行
bw.write(line);
bw.newLine();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//释放资源
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}