Java---网络编程
Java---网络编程
汪小昕 发表于2年前
Java---网络编程
  • 发表于 2年前
  • 阅读 78
  • 收藏 5
  • 点赞 2
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 本文旨在梳理基于Java语言的网络编程知识学习整理,通过对网络编程的基本知识讲解,并通过代码实现完成网络编程的学习。

    谈起Java的网络编程,首先要了解网络通信的基本原理。

    首先要了解的是网络三要素:ip地址,端口,网络链接。 如何理解这三要素呢,例如我要去个小区找个人,那么首先我需要知道这个小区在什么地方,即ip地址。知道小区在哪里之后,就需要知道此人的家在小区的哪个地方例如几栋几室,即为端口。网络连接顾名思义,客户端与服务端需要连接需要有链接路径,如无线wifi,网线等。

    那么建立链接后,服务端与客户端如何通过链接进行彼此通信呢,就比如2座小岛可以通过船进行货物的传输,船是需要停靠在码头上来装载货物然后进行传输的。同理,网络中建立链接后同样也需要这种“码头”来装载货物。因此就提出了Socket的概念。其实网络编程也即Socket编程。

    我们知道数据有不同的格式,那么为了双方均能解析数据,因此就需要达成统一的协议,例如2个人交谈,1个只会说中文,另1个只会说英文,那么这2个人交流便会不知所云。因为他们即使能接收到对方说的话(数据),但不能了解其中的含义(无法解析)。因此,双方达成统一协议时才能进行有效的通信。目前较普遍的有UDP和TCP两种通信协议。

    UDP:User Datagram Protocl。用户数据协议。是一种不需要服务端与客户端建立连接的传输协议。当用户需要上传数据给服务端时,直接发数据,服务端收没收到不考虑。其优点是速度快,缺点便是传输不可靠。

    TCP:Transmission Control Protocl:传输控制协议。是需要服务端与客户端建立连接的传输协议。只有当2者建立连接后才能进行数据传输。优点是保证数据的传输,缺点是速度慢。

    Java中分别对2种传输协议有其对应的Socket类。对于UDP中均使用DatagramSocket进行Socket连接的建立(即建立码头)。而TCP中则对应客户端的Socket由Socket类实现,服务端的Socket由SocketServer实现。

    下面分别针对2种传输协议进行代码实现:

    UDP:实现的是客户端从控制台发送数据给服务端,服务端接收到后打印出来。并只有输入exit时才断开连接。

import java.net.*;
import java.util.Scanner;
//发送端
class SocketSend{
	public static void main(String[] args) throws Exception{
		//建立socket链接
		DatagramSocket ds = new DatagramSocket(10000);
		while(true){
			//准备数据
			Scanner sc = new Scanner(System.in);
			String str = sc.next();
			byte[] data = str.getBytes();
			//数据封包  DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
			DatagramPacket dp = new DatagramPacket(data,data.length,InetAddress.getLocalHost(),20000);
			//发送数据
			ds.send(dp);
			//判断是否断开链接
			if(str.equals("exit"))
				break;
		}
		//关闭链接
		ds.close();
	}
}
//接收端
class SocketRece{
	public static void main(String[] args) throws Exception{
		//建立socket链接
		DatagramSocket ds = new DatagramSocket(20000);
		while(true){
			//准备数据包接收数据
			byte[] data = new byte[1024];
			DatagramPacket dp = new DatagramPacket(data,data.length);
			//通过socket的receive方法接收数据
			ds.receive(dp);
			//取出数据	
			String name = dp.getAddress().getHostName();
			String address = dp.getAddress().getHostAddress();
			String date = new String(dp.getData(),0,dp.getLength());
			int port = dp.getPort();
			
			//判断是否断开链接
			if(date.equals("exit"))
				break;
			System.out.println(name+"---"+address+"---"+date+"---"+port);
		}
		ds.close();
	}
}

    首先客户端发送数据的步骤如下:

  1. 建立Socket连接。

  2. 准备要发送的数据。

  3. 通过Socket发送数据。

    那么服务端的接收数据步骤如下:

  1. 建立Socket连接。

  2. 建立数据包装载接收过来的数据包。

  3. 读取数据包中的数据。

    那么UDP的发送与接收主要分为这几部。接下来是TCP的传输,其要实现的功能是客户端上传一个文件给服务端,服务端收到后并返回给客户端一个反馈信息。

    代码如下:

import java.net.*;
import java.io.*;

//TCP客户端
class SocketClient{
	public static void main(String[] args) throws Exception{
		//建立Socket链接
		Socket ss = new Socket("192.168.0.104",10003);
		//获取输出流,准备发送
		PrintWriter pw = new PrintWriter(ss.getOutputStream(),true);
		//准备需上传的文件
		BufferedReader br = new BufferedReader(new FileReader("D:/Java-Exercise/SocketDemo/SocketDemo.java"));
		//向流中注入数据
		String line = null;
		while((line=br.readLine())!=null){
			pw.println(line);
		}
		//关闭输出流
		ss.shutdownOutput();
		//接收是否收到服务器的反馈
		BufferedReader brback = new BufferedReader(new InputStreamReader(ss.getInputStream()));
		String back = brback.readLine();
		System.out.println(back);
		//关闭链接
		ss.close();
	}
}


//TCP服务端
class SocketServer{
	public static void main(String[] args) throws Exception{
		//建立SocketServer链接
		ServerSocket ss = new ServerSocket(10003);
		//获取链接过来的socket
		Socket s = ss.accept();
		String ip = s.getLocalAddress().getHostAddress();
		System.out.println(ip+"-------connected");
		//通过输入流读出数据
		BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
		//准备缓存读入接收的数据
		PrintWriter pw = new PrintWriter(new FileWriter("123.txt"),true);
		//向缓存文件中写入数据
		String data = null;
		while((data=br.readLine())!=null){
			pw.println(data);
		}
		//上传完成后向客户端进行反馈
		PrintWriter pwback = new PrintWriter(s.getOutputStream(),true);
		pwback.println("上传成功");
		
		pw.close();
		s.close();
	}
}

    那么客户端的上传文件的基本步骤如下:

  1. 建立Socket连接。

  2. 准备要上传的文件(因为上传的是文本文件,都是字符,因此使用字符流PrintWriter,需使用其println方法进行数据的刷新)。

  3. 获取Socket的输出流。

  4. 将文件写入输出流。并在文件全部写完后关闭输出流。

  5. 获取Socket的输出流,判断是否收到服务端的反馈。

    服务端的接收文件并反馈基本步骤如下:

  1. 建立Socket连接。

  2. 获取客户端的Socket对象。

  3. 通过客户端的Socket对象获取输入流。

  4. 建立新文件,装载输入流中的数据。

  5. 将输入流中的数据写入新创建的文件中。

  6. 获取客户端Socket对象的输出流。在输出流中写入反馈信息。

    TCP的传输大致如此。需要注意的便是在使用PrintWriter时需使用println方法才能成功写入。(具体原因进一步探究)。

    了解TCP上传原理后,自然也能上传图片,视频等数据文件。不过它们是字节文件需使用字节流处理。

标签: Java 网络编程 TCP UDP
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 1
码字总数 1589
×
汪小昕
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: