JAVA基础----网络编程

网络编程: Socket编程


网络编程的三个要素

IP地址:


有32位或者128位表示, 常用的IP地址是32位  也就是IPV4,  128位代表IPV6

IP地址的分类:


A: 1.0.0.1 -- 127.255.255.254 10.x.x.x 是私有地址


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


C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址


D类 224.0.0.1---239.255.255.254


E类 240.0.0.1---247.255.255.254



口号:


0-65535 其中0-1024为系统保留端口


传输协议:
UDP协议:
面向无连接的协议,速度快,不安全

用来视频聊天,语音聊天



TCP协议:
面向有连接的协议,速度稍慢,安全,会进行三次握手操作

数据的传输




使用UDP进行数据的传输:

发送端:


1: 创建UDP协议的发送端DatagramSocket对象
2:  把要发送的数据 ,封装成 数据报包  使用DatagramPacket对象完成
3:  发送数据报包, send(dp)方法

4:  关闭Socket流, 使用close()方法


public static void main(String[] args) {

		System.out.println("启动发送端");

		DatagramSocket ds = null;

		try {
<span style="white-space:pre">			</span>//<span style="font-size:24px;">创建UDP协议的发送端DatagramSocket对象</span>
			ds = new DatagramSocket();

			//<span style="font-size:24px;">把要发送的数据 ,封装成 数据报包  使用DatagramPacket对象完成</span>

<span style="font-size:24px;"><span style="white-space:pre">			</span>byte[] by = "我来了。。。。。。。".getBytes();</span>
<span style="font-size:24px;">			InetAddress ia = InetAddress.getByName("127.0.0.1");</span>
<span style="font-size:24px;">
<span style="white-space:pre">			</span>//<span style="font-size:24px;"> 发送数据报包, send(dp)方法</span>
			ds.send(new DatagramPacket(by, by.length, ia, 10000));

		} catch (SocketException e) {

			System.out.println("端口无法应用");

			return;

		} catch (UnknownHostException e) {

			e.printStackTrace();

		} catch (IOException e) {

			e.printStackTrace();
		} finally {
<span style="white-space:pre">			</span>//<span style="font-size:24px;"> 关闭Socket流, 使用close()方法</span>
			ds.close();

		}
	}</span>




接收端:


1:  创建UDP协议的接收端DatagramSocket对象
2;  创建空的数据报包, 用来存储接收到的数据
3:  接收数据,把数据存储到空的数据报包中
4: 解析数据报包中的数据
获取IP地址  getAddress();
获取数据:  getData();
获取数据的长度: getLength();

5:  关闭Socket流,使用close()方法

	public static void main(String[] args) {
		DatagramSocket ds = null;
		try {
<span style="white-space:pre">			</span>//<span style="font-size:24px;">创建UDP协议的接收端DatagramSocket对象</span>
			ds = new DatagramSocket(10000);

			byte[] by = new byte[1024];

<span style="white-space:pre">			</span>//<span style="font-size:24px;"> 创建空的数据报包, 用来存储接收到的数据</span>
			DatagramPacket dp = new DatagramPacket(by, by.length);

<span style="white-space:pre">			</span>//<span style="font-size:24px;">接收数据,把数据存储到空的数据报包中</span>
			ds.receive(dp);
<span style="white-space:pre">			</span>
<span style="white-space:pre">			</span>//<span style="font-size:24px;">解析数据报包中的数据  <span style="font-size:24px;">获取IP地址  getAddress();</span></span>
			InetAddress ia = dp.getAddress();

<span style="white-space:pre">			</span>//<span style="font-size:24px;">获取数据:  getData();</span>
			System.out.println(ia.getHostAddress());

<span style="white-space:pre">			</span>//<span style="font-size:24px;">获取数据的长度: getLength();</span>
			int in = dp.getLength();

			String str = new String(by, 0, in);

			System.out.println(str);

		} catch (Exception e) {

		} finally {

<span style="white-space:pre">			</span>//<span style="font-size:24px;">关闭Socket流,使用close()方法</span>
			ds.close();
		}
	}




使用TCP进行数据的传输:
客户端;
1: 创建客户端的Socket对象
2:  准备要发送的数据
3:  通过Socket对象中的输出流,完成数据的发送
4:  告知服务器 ,数据已发送完毕,  shutdownOutput()
5:  获取服务器的反馈信息
6;  关闭Socket流

public static void main(String[] args) {

		Socket sk = null;

		try {

			// 创建客户端的Socket对象
			sk = new Socket("127.0.0.1", 12345);

			// 准备要发送的数据
			String str = "我来了";

			// 通过Socket对象中的输出流,完成数据的发送
			OutputStream os = sk.getOutputStream();
			os.write(str.getBytes());

			// 告知服务器 ,数据已发送完毕, shutdownOutput()
			sk.shutdownOutput();

			// 获取服务器的反馈信息
			InputStream is = sk.getInputStream();

			byte[] by = new byte[1024];

			int len = is.read(by);

			str = new String(by, 0, len);

			System.out.println(str);

		} catch (Exception e) {

		} finally {
			
			//如果sk不为null则关闭流
			if (sk != null) {

				try {
					
					// 关闭Socket流
					sk.close();
					
				} catch (IOException e) {
					
					e.printStackTrace();
				}
			}
		}
	}



服务器端:
1:  创建服务器端ServerSocket对象
2:  等待客户端的连接

3:  创建线程对象,并启动,通过每个线程对象,来完成与客户端Socket对象

的数据传输

	public static void main(String[] args) throws IOException {

		// 创建服务器端ServerSocket对象
		ServerSocket ss = new ServerSocket(11114);

		while (true) {
			// 等待客户端的连接
			
			Socket s = ss.accept();
			
			// 创建线程对象,并启动,通过每个线程对象,来完成与客户端Socket对象<span style="font-size:24px;">的数据传输</span>
			new TcpServer(s).start();

		}

	}


a: 获取IP地址
String ip =  s.getInetAddress().getHostAddress();

b: 获取数据
1): 获取客户端的输入流对象
2): 通过输入流对象, 读取流中的数据
3): 把数据进行处理(打印,存储到文件中)

c: 编写客户端反馈信息
1): 获取客户端的输出流对象
2): 写 给客户端的反馈信息

d: 关闭客户端Socket流



<span style="font-size:24px;">public class TcpServer extends Thread {
	private Socket s;

	public TcpServer(Socket s) {
		super();
		this.s = s;
	}

	@Override
	public void run() {

		// 获取IP地址
		String str1 = s.getInetAddress().getHostAddress();
		
		try {
			
			// 获取数据
			BufferedReader br = new BufferedReader(new 
					/* 通过输入流对象, 读取流中的数据 */InputStreamReader(

					/* 获取客户端的输入流对象 */s.getInputStream()));

			for (String str = ""; (str = br.readLine()) != null;) {

				// 把数据进行处理(打印,存储到文件中)
				System.out.println(str1 + ":" + str);
			}
			// 获取客户端的输出流对象
			OutputStream os = s.getOutputStream();

			// 写 给客户端的反馈信息
			os.write("收到".getBytes());
			
		} catch (IOException e) {
			
			e.printStackTrace();
			
		} finally {

			if (s != null) {
				try {
					// 关闭客户端Socket流
					s.close();
					
					System.out.println(str1 + "已退出");
					
				} catch (IOException e) {
					
					e.printStackTrace();
				}
			}

		}
	}
}
</span>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值