浅谈网络编程

本文介绍了网络通信的基本概念,包括网络类型、IP地址与端口号的作用,TCP与UDP协议的区别,以及如何使用Java进行UDP和TCP编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

1、网络:将不同区域的计算机连接到一起   局域网 城域网  互联网
2、地址:IP地址 确定网络上 一个绝对地址 |位置  --->房子的地址
3、端口号: 区分计算机软件的   -->房子的房门 2个字节    0-65535  共65536个
    (1) 在同一个协议下 端口号不能重复  不同协议下可以重复
    (2) 1024以下的不要使用  80-->http 21 -->ftp
4、资源定位: URL 统一资源定位符   URI :统一资源
5、数据的传输
    (1) 协议: Tcp 和UDP协议
          1)、TCP(transfer control protocol): 电话 类似于三次握手   面向连接  安全可靠 效率低下
          2)、UDP(UserDatagramProtocol ): 短信 非面向连接  效率高
    (2) 传输:
          1)、先封装

          2)、后拆封

地址及端口

1、InetAddress :封装 IP 及DNS
 方法:
    getHostAddress() 返回ip地址
    getHostName() 返回域名|本机为计算机名
    InetAddress.getLocalHost();
    InetAddress.getByName("ip地址|域名");
2、InetSocketAddress:封装端口
    (1) 创建对象: 
        InetSocketAddress(String hostname, int port) 
        InetSocketAddress(InetAddress addr, int port) 
    (2) 方法:
        getAddress() 
        getHostName() 

        getPort() 

/**
 * 没有封装端口
 * @author FeiEr
 *
 */
public class InetDemo01 {

	public static void main(String[] args) throws UnknownHostException{		
		//使用getLocalHost方法创建InetAddress对象
		InetAddress addr = InetAddress.getLocalHost();
		System.out.println(addr.getHostAddress());  //返回:192.168.1.100
		System.out.println(addr.getHostName());  //输出计算机名
		//根据域名得到InetAddress对象
		addr = InetAddress.getByName("www.163.com"); 
		System.out.println(addr.getHostAddress());  //返回 163服务器的ip:61.135.253.15
		System.out.println(addr.getHostName());  //输出:www.163.com	
		//根据ip得到InetAddress对象
		addr = InetAddress.getByName("61.135.253.15"); 
		System.out.println(addr.getHostAddress());  //返回 163服务器的ip:61.135.253.15
		System.out.println(addr.getHostName());  //输出ip而不是域名。如果这个IP地 址不存在或DNS服务器不允许进行IP地址和域名的映射,getHostName方法就直接返回这个IP地址。

	}

}
/**
 * 封装端口:在InetAddress基础上+端口
 * @author FeiEr
 *
 */
public class InetSockeDemo01 {

	public static void main(String[] args) throws UnknownHostException {
		InetSocketAddress  address = new InetSocketAddress("127.0.0.1",9999);
		address = new InetSocketAddress(InetAddress.getByName("127.0.0.1"),9999);
		System.out.println(address.getHostName());
		System.out.println(address.getPort());
		InetAddress addr =address.getAddress();
		System.out.println(addr.getHostAddress());  //返回:地址
		System.out.println(addr.getHostName());  //输出计算机名
		
	}

}

URL

URI(Uniform resource identifier)统一资源标识符,用来唯一的标识一个资源。
URL(Uniform Resource Locator)统一资源定位器,它是一种具体的URI 

四部分组成: 协议  存放资源的主机域名  端口 资源文件名(/)

1、创建
    URL(String spec)  :绝对路径构建
    URL(URL context, String spec)  :相对路径构建
2、方法
    System.out.println("协议:"+url.getProtocol());
    System.out.println("域名:"+url.getHost());
    System.out.println("端口:"+url.getPort());
    System.out.println("资源:"+url.getFile());
    System.out.println("相对路径:"+url.getPath());
    System.out.println("锚点:"+url.getRef()); //锚点
    System.out.println("参数:"+url.getQuery());//?参数 :存在锚点  返回null ,不存在,返回正确
3、流
    openStream() 

/**
 * 
 * @author FeiEr
 */
public class URLDemo01 {

	public static void main(String[] args) throws MalformedURLException {
		//绝对路径构建
		URL url = new URL("http://www.baidu.com:80/index.html?uname=bjsxt");
		System.out.println("协议:"+url.getProtocol());
		System.out.println("域名:"+url.getHost());
		System.out.println("端口:"+url.getPort());
		System.out.println("资源:"+url.getFile());
		System.out.println("相对路径:"+url.getPath());
		System.out.println("锚点:"+url.getRef()); //锚点
		System.out.println("参数:"+url.getQuery());//?参数 :存在锚点  返回null ,不存在,返回正确

		url = new URL("http://www.baidu.com:80/a/");
		url = new URL(url,"b.txt"); //相对路径
		System.out.println(url.toString());
	
	}

}

UDP通信

UDP:以数据为中心   非面向连接  不安全 数据可能丢失  效率高

1、类 DatagramSocket DatagramPacket
客户端:
   (1) 创建客户端   DatagramSocket  类  +指定端口
   (2) 准备数据  字节数组
   (3) 打包  DatagramPacket +服务器地址 及端口
   (4) 发送
   (5) 释放资源 

/**
 * 
 * @author FeiEr
 */
public class Client {

	public static void main(String[] args) throws IOException {
		//1、创建客户端 +端口
		DatagramSocket client = new DatagramSocket(6666);
		//2、准备数据
		double num =89.12;
		byte[] data =convert(num);
		//3、打包(发送的地点 及端口) DatagramPacket(byte[] buf, int length, InetAddress address, int port)
		DatagramPacket packet = new DatagramPacket(data,data.length,new InetSocketAddress("localhost",8888));
		//4、发送
		client.send(packet);
		//5、释放
		client.close();
		
	}
	
	/**
	 * 字节数组 数据源  +Data 输出流 
	 */
	public static byte[] convert(double num) throws IOException{
		byte[] data =null;
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		DataOutputStream dos =new DataOutputStream(bos);
		dos.writeDouble(num);
		dos.flush();
		
		//获取数据
		data = bos.toByteArray();
		dos.close();		
		return data;

	}
}
2、服务器端:
   (1) 创建服务端  DatagramSocket  类  +指定端口
   (2) 准备接收容器  字节数组  
   (3) 封装 DatagramPacket 
   (4) 包-->接收数据
   (5) 分析数据

   (6) 释放资源

/**
 *
 * @author FeiEr
 */
public class Server {

	public static void main(String[] args) throws IOException {
		//1、创建服务端 +端口
		DatagramSocket server = new DatagramSocket(8888);
		//2、准备接受容器
		byte[] container = new byte[1024];
		//3、封装成 包 DatagramPacket(byte[] buf, int length) 		
		DatagramPacket packet =new DatagramPacket(container, container.length) ;
		//4、接受数据
		server.receive(packet);
		//5、分析数据
		double data =convert(packet.getData());
		System.out.println(data);
		//6、释放
		server.close();	

	}

	/**
	 * 字节数组 +Data 输入流
	 */
	public static double convert(byte[] data) throws IOException{
		DataInputStream dis =new DataInputStream(new ByteArrayInputStream(data));
		double num =dis.readDouble();
		dis.close();
		return num;
	}
}

Socket通信

基于tcp: 面向连接 安全 可靠 效率低 ,类似于打电话

1、面向连接:  请求-相应 Request --Response
2、Socket编程
服务器: ServerSocket

/**
 * 必须先启动服务器 后连接
 * 1、创建服务器  指定端口   ServerSocket(int port) 
 * 2、接收客户端连接  
 * 3、发送数据+接收数据
 * @author FeiEr
 *
 */
public class Server {

	public static void main(String[] args) throws IOException {
		//1、创建服务器  指定端口   ServerSocket(int port) 
		ServerSocket server = new ServerSocket(8888);
		//2、接收客户端连接   阻塞式
		Socket socket =server.accept();
		System.out.println("一个客户端建立连接");
		//3、发送数据
		String msg ="欢迎使用";
		//输出流
		/*
		BufferedWriter bw = new BufferedWriter(
				new OutputStreamWriter(
				socket.getOutputStream()));
		
		bw.write(msg);
		bw.newLine();
		bw.flush();
		*/
		DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
		dos.writeUTF(msg);
		dos.flush();
		
	}

}

客户端: Socket

/**
 * 1、创建客户端   必须指定服务器+端口    此时就在连接
 * 	Socket(String host, int port) 
 * 2、接收数据 +发送数据	
 * @author FeiEr
 *
 */
public class Client {

	public static void main(String[] args) throws UnknownHostException, IOException {
		//1、创建客户端   必须指定服务器+端口    此时就在连接
		Socket client = new Socket("localhost",8888);
		//2、接收数据
		/*
		BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
		String echo =br.readLine(); //阻塞式方法
		System.out.println(echo);
		*/
		DataInputStream dis = new DataInputStream(client.getInputStream());
		String echo = dis.readUTF();
		System.out.println(echo);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值