网络编程


一、概述

网络编程就是用Java语言实现计算机间数据的信息传递和资源共享


1.网络编程模型

1)OSI(Open System Interconnection开放系统互连)参考模型

1)TCP/IP参考模型


2.网络编程的三要素

1)IP地址:网络中设备的标识,不易记忆,可用主机名

A:点分十进制:IP:192.168.1.100


B:IP地址的组成:网络号段+主机号段

A类:第一号段为网络号段+后三段的主机号段

一个网络号:256*256*256 = 16777216

B类:前二号段为网络号段+后二段的主机号段

一个网络号:256*256 = 65536

C类:前三号段为网络号段+后一段的主机号段

一个网络号:256


C:IP地址的分类

A类 1.0.0.1---127.255.255.254

(1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址) 

        (2)127.X.X.X是保留地址,用做循环测试用的。

B类 128.0.0.1---191.255.255.254172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。

C类 192.0.0.1---223.255.255.254192.168.X.X是私有地址

D类 224.0.0.1---239.255.255.254

E类 240.0.0.1---247.255.255.254

特殊的IP地址:

127.0.0.1 回环地址(表示本机)

x.x.x.255 广播地址

x.x.x.0 网络地址


2)端口:用于标识进程的逻辑地址,不同进程的标识

范围:0-65535。其中0-1024为系统使用或保留端口不建议使用。

3)协议

UDP:数据打包,有限制,不连接,效率高,不可靠

TCP:建立数据通道,无限制,效率低,可靠


二、详解


1.InetAddress

此类表示互联网协议 (IP) 地址。

1)创建对象方法:

public static InetAddress getByName(String host):根据主机名或者IP地址的字符串表示得到IP地址对象

2)常用方法:

public String getHostName():获取主机名

public String getHostAddress():获取IP地址


2.Socket机制

1)通信两端都应该有Socket对象

2)所有的通信都是通过Socket间的IO进行操作的


3.DatagramSocket和DatagramPacket

基于UDP协议,用来发送和接收数据报包的套接字

1)常用构造方法:

DatagramSocket:

public DatagramSocket()

public DatagramSocket(int port)

public DatagramSocket(int port,InetAddress  laddr)

DatagramSocket:

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port)


2)常用方法:

DatagramSocket:

public void send(DatagramPacket p):发送数据包

public void receive(DatagramPacket p):接收数据包

public InetAddress getInetAddress():返回此套接字连接的地址

DatagramPacket:

public InetAddress getInetAddress():返回数据报将要发往该机器或者是从该机器接收到的IP 地址

public byte[] getData():返回数据缓冲区

public int getLength():返回将要发送或接收到的数据的长度


3)发送:

A:创建UDP发送端的Socket对象(DatagramSocket)

B:创建数据并把数据打包

C:发送数据

D:释放资源

案例:

package cn.itcast_02;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendDemo {
	public static void main(String[] args) throws IOException {
		// 创建发送端Socket对象
		// DatagramSocket()
		DatagramSocket ds = new DatagramSocket();

		// 创建数据,并把数据打包
		// DatagramPacket(byte[] buf, int length, InetAddress address, int port)
		// 创建数据
		byte[] bys = "hello,udp,我来了".getBytes();
		// 长度
		int length = bys.length;
		// IP地址对象
		InetAddress address = InetAddress.getByName("192.168.12.92");
		// 端口
		int port = 10086;
		DatagramPacket dp = new DatagramPacket(bys, length, address, port);

		// 调用Socket对象的发送方法发送数据包
		// public void send(DatagramPacket p)
		ds.send(dp);

		// 释放资源
		ds.close();
	}
}


4)接收:

A:创建UDP接收端的Socket对象(DatagramSocket)

B:创建数据包用于接收数据

C:接收数据

D:解析数据包

E:释放资源

案例:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveDemo {
	public static void main(String[] args) throws IOException {
		// 创建接收端的Socket对象
		DatagramSocket ds = new DatagramSocket(12345);

		while (true) {
			// 创建一个包裹
			byte[] bys = new byte[1024];
			DatagramPacket dp = new DatagramPacket(bys, bys.length);

			// 接收数据
			ds.receive(dp);

			// 解析数据
			String ip = dp.getAddress().getHostAddress();
			String s = new String(dp.getData(), 0, dp.getLength());
			System.out.println("from " + ip + " data is : " + s);
		}

		// 释放资源
		// 接收端应该一直开着等待接收数据,是不需要关闭
		// ds.close();
	}
}


4.Socket与ServerSocket

基于TCP协议,发送和接收数据

1)常用构造方法:
Socket

public Socket(InetAddress address, int port)

public Socket(String host, int port)

ServerSocket

public ServerSocket(int port)


2)常用方法:

Socket

public OutputStream getOutputStream():获取输出流,用于写需要发送的数据

public InputStream getInputStream():获取输如流,用于读取需要发送的数据

public void shutdownOutput():Socket提供了一个终止,通知服务器数据发送完毕

public voidshutdownInput():类似于shutdownOutput关闭的是输入流


ServerSocket

public Socket accept():侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。


3)发送:

A:创建TCP客户端的Socket对象

B:获取输出流,写数据

C:释放资源

案例

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;

/*
 * 客户端文本文件,服务器输出到控制台
 */
public class ClientDemo {
	public static void main(String[] args) throws IOException {
		// 创建Socket对象
		Socket s = new Socket("192.168.12.92", 34567);

		// 封装文本文件
		BufferedReader br = new BufferedReader(new FileReader(
				"InetAddressDemo.java"));
		// 封装通道内的流
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
				s.getOutputStream()));

		String line = null;
		while ((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}

		br.close();
		s.close();
	}
}


4)接收:

A:创建TCP服务器端的Socket对象

B:监听客户端连接

C:获取输入流,读取数据

D:释放资源

案例

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo {
	public static void main(String[] args) throws IOException {
		// 创建服务器Socket对象
		ServerSocket ss = new ServerSocket(34567);

		// 监听客户端连接
		Socket s = ss.accept();

		// 封装通道内的流
		BufferedReader br = new BufferedReader(new InputStreamReader(
				s.getInputStream()));

		String line = null;
		while ((line = br.readLine()) != null) {
			System.out.println(line);
		}

		
		s.close();
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值