Java基础_12 UDP、TCP数据交互

网络编程

  1. 网络通信协议
    • 网络:由多台计算机,以及外部设备连接起来的一个系统成为网络
    • 通信协议:规定网络上传输的数据的格式、大小、速度
    • TCP/IP协议、UDP协议
  2. IP地址和端口号
    • IP地址
    • 端口号
      • MySql—3306
      • Web服务器—Tomcat----8080
      • Oracle----1521
  3. InetAddress类(代表IP地址的类)
    • 方法
public static InetAddress getByName();	//获取远程主机的IP
public static InetAddress getLocalHost();	//获取计算机的IP地址对象
public static String getHostName();	//获取用户名
public static String getHostAddress();	//获取IP地址

//示例
InetAddress my = InetAddress.getLocalHost();	//返回值为一个IP地址类对象
String myName = my.getHostName();	//获取用户名
String myAddress = my.getHostAddress();	//获取IP
System.out.println(my);
System.out.println(myName);
System.out.println(myAddress);
  1. 使用UDP进行数据交换
    • DatagramSocket:数据接收发送器

    • DatagramPacket:数据包对象

    • 发送端操作步骤:

      • 创建一个数据接收发送器

      • 创建一个数据包对象

      • 发生(send方法)

      • 示例

//1.创建发送器
DatagramSocket ds = new DatagramSocket();
//2.创建数据包
while(true) {
	System.out.println("请输入需要发送的数据:");
	Scanner sc = new Scanner(System.in);
	String data = sc.nextLine();
	byte [] arr = data.getBytes();
	//将数据整理,放入包中
	DatagramPacket dp = new DatagramPacket(arr,arr.length,InetAddress.getByName("127.0.0.1"),12345);
	//3.发送
	ds.send(dp);
}
  • 接收方操作步骤

    • 创建一个数据接收发送器

    • 创建一个数据包对象

    • 接收(receive)

    • 示例

//1.创建发送器
DatagramSocket ds = new DatagramSocket(12345);	//设置接收器的端口号
byte[] getData = new byte[1024];	//创建一个字符数组接收数据
//2.创建接收数据包
while(true) {
	System.out.println("正在等待接收数据~~~");
	DatagramPacket dp = new DatagramPacket(getData,getData.length);
	//3.接收数据
	ds.receive(dp);
	//4.获取发送者的IP地址
	String sendAddress = dp.getAddress().getHostAddress();
	System.out.println(sendAddress+"正在向本机发送数据~~~");
	System.out.println("发送的数据:"+ new String(getData));
}
  1. 使用TCP数据交换

    用户端:

    • 创建一个客户端对象(注意:指定这个Socket要连接的服务器的IO和端口号)

      • 此构造方法自动连接服务器
      • 自动进行三次握手,并建立连接
      • 自动为连接创建两个流
    • 从客户端对象中获取输出流:getOutputStream();

    • 调用输出流的Write方法写数据到服务器

    • 调用输入流的read方法获取服务器的反馈

    • 关闭资源

    • 示例

 Socket client = new Socket("127.0.0.1",12345);	//设置发送器的目的ip和端口号
 client.getOutputStream().write("你好呀,我是xxx,很高兴认你!!!".getBytes());	//获取输出流,并发送数据
 String serverReturn = new ReadDemo().TCPRead(client);	//获取服务器反馈
 System.out.println("数据发送成功!!!");
 System.out.println("收到服务器反馈数据:"+serverReturn);
 client.close();

服务器端

  • 创建ServersSocket对象,传入一个端口

  • 先获取哪一个客户端的服务器,通过accept()方法获取

  • 通过Sockrt对象获取输入流,调用read方法读取客户端发来的数据

  • 通过Socket对象获取输出流,调用write方法想客户端反馈数据

  • 关闭(ServerSocket,Socket)

  • 示例

ServerSocket server = new ServerSocket(12345);	//设置接收数据端口
System.out.println("等待客户端访问......");
Socket client = server.accept();	//获取发送数据的客户端对象
String data = new ReadDemo().TCPRead(client);	//读取数据
System.out.println("IP为"+client.getInetAddress().getHostAddress()+"的客户端发送了:"+data);
client.getOutputStream().write("服务器已收到数据。".getBytes());
client.close();
server.close();

多线程使用TCP上传文件到服务器示例

客户端
//1.创建Socket对象,连接服务器
Socket client = new Socket("192.168.1.102",12345);
//2.获取输出流,把数据写到数据库
OutputStream out = client.getOutputStream();
//3.创建文件输入流,读取本地文件
FileInputStream fr = new FileInputStream("1.txt");
byte[] by = new byte[1024];
int len = 0;
while((len=fr.read(by))!=-1) {
	//4.向服务器上传数据
	out.write(by, 0, len);
}
//5.向服务器说明数据上传完毕
client.shutdownOutput();
System.out.println("数据发送成功!!!");
//6.获取服务器反馈
String serverReturn = new ReadDemo().TCPRead(client);
System.out.println("收到服务器反馈数据:"+serverReturn);
client.close();
服务器端
//1.创建服务器对象
ServerSocket server = new ServerSocket(12345);
while(true) {
	System.out.println("等待客户端访问......");
	//2.获取连接服务器的客户端
	Socket client = server.accept();
	//开启一个线程,和client进行交互
	new Thread(new Runnable() {	//匿名内部接口
		
		@Override
		public void run() {
			try {
				//3.获取输入流,读取客户端发来的数据
				InputStream in = client.getInputStream();
				//4.创建文件的输出流,把数据保存到文件
				FileOutputStream out = new FileOutputStream("demo.txt");
				//5.循环从输入流读取客户数据输出到文件中
				byte[] by = new byte[1024];
				int len = 0;
				while((len = in.read(by))!=-1) {
					out.write(by, 0, len);
				}
				System.out.println("IP为"+client.getInetAddress().getHostAddress()+"上传数据成功。");
				//6.服务器反馈
				client.getOutputStream().write("服务器已收到数据。".getBytes());
				client.close();	//关闭客户端对象
				out.close();	//关闭文件输出流
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}).start();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值