Java之网络编程

一、网络编程的介绍

网络编程就是通过Socket进行相关的网络通信,涉及到的知识有ip、端口号、网络协议等等。

 

二、网络编程三要素

1、IP

每个设备在网络中唯一的标识(ipconfig查看本机的ip, ping ip/域名地址 测试连接)

IP地址分类:

Ipv4 4个字节组成 4个0-255 总43亿 2011年已经用尽

Ipv6 8个字节组成 每组4个16进制

2、端口

每个应用程序在设备上唯一标识,编写网络应用需要绑定一个端口号,尽量使用1024以上的看,1024以下基本被系统占用

3、协议(重点)

为计算机网络中进行数据交换而建立的规则,标准或约定的集合

UDP--面向无连接,数据不安全,速度快,不区分客户端与服务端

TCP--面向连接(三次握手),数据安全,速度略低,分为客户端和服务端

对三要素进行举例子说明: 我要到酒店找你。ip就是酒店名称,端口号就是你住的房间号,协议就是我找到你后有一个规则该干嘛该干嘛

 

三、Socket介绍

Socket就是套接字:ip+端口号组成(一般组成一个网络入口。网络上具有唯一标识的ip地址和端口号组成在一起才能构成唯一能识别的标识符套接字)

网络通信就是Socket间的通信

数据在两个Socket间通过IO流传输

Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP与Port

 

四、网络通信之UDP协议

UDP协议:面向无连接,数据不安全,速度快,不区分客户端与服务端

例子:Receive接收来自Send发送的消息(Receive需要先启动)

图解

 

Send.java

package com.xue.socket;

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

/**
 * 信息发送方
 * 1、创建socket,发送数据
 * 2、数据创建
 * 3、创建packet,装数据
 * 4、发送数据
 * 5、关闭socket
 * @author 
 *
 */
public class Send {
	public static void main(String[] args) throws Exception {
		//1、创建socket,发送数据
		DatagramSocket socket = new DatagramSocket();				//定义一个socket,发送数据
		//2、数据创建
		String str = "I am XiaoMing!";
		//3、创建packet,装数据
		DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 12345);	//定义一个packet,装数据
		//4、发送数据
		socket.send(packet);
		//5、关闭socket
		socket.close();
	}
}

 

Receive.java

package com.xue.socket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * 信息接收方
 * 1、创建socket,接收数据
 * 2、创建packet,装数据
 * 3、取出数据放入packet
 * 4、处理数据
 * 5、关闭socket
 * @author 
 *
 */
public class Receive {
	public static void main(String[] args) throws Exception{
		//1、创建socket,接收数据
		DatagramSocket socket = new DatagramSocket(12345);
		//2、创建packet,装数据
		DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
		//3、取出数据
		socket.receive(packet);
		//4、处理数据
		String str = new String(packet.getData(), 0, packet.getLength());
		System.out.println("IP:" + packet.getAddress() + "  端口号:" + packet.getPort() +":  " + str);
		//5、关闭socket
		socket.close();
	}
}

 

对上面例子进行改进,接收方不断接收发送方消息,改进部分代码如下:

/*发送方改进输入数据代码*/
		Scanner scan = new Scanner(System.in);
		while (true) {
			String str = scan.nextLine();
			if (str.equals("quit")) {
				break;
			} else {
				packet = new 
						DatagramPacket(str.getBytes(), str.getBytes().length, 
								InetAddress.getByName("127.0.0.1"), 6666);
				//4、发送数据
				socket.send(packet);
			}
		}


/*接收方改进接收数据代码*/
		while (true) {
			//3、取出数据
			socket.receive(packet);
			//4、处理数据
			String str = new String(packet.getData(), 0, packet.getLength());
			System.out.println("IP:" + packet.getAddress() + "  端口号:" + 
               packet.getPort() +":  " + str);
		}

 

五、网络通信之TCP协议

TCP协议:面向连接(三次握手),数据安全,速度略低,分为客户端和服务端

图解

 

例子:服务端与客户端的交流

Server.java

package com.xue.socket;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务端
 * 1、创建socket
 * 2、接收请求
 * 3、处理请求
 * 4、关闭socket
 * @author 
 *
 */
public class Server {
	public static void main(String[] args) throws Exception {
		//1、创建socket
		ServerSocket socket = new ServerSocket(12345);
		//2、接收请求
		Socket accept = socket.accept();
		//3、获取输入输出流
		InputStream ip = accept.getInputStream();
		OutputStream op = accept.getOutputStream();
		//4、处理请求
		op.write("OK".getBytes());
		byte[] by = new byte[1024];
		int len = ip.read(by);
		System.out.println(new String(by, 0, len));
		//4、关闭socket
		socket.close();
	}

}

Client.java

package com.xue.socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 客户端
 * 1、创建socket
 * 2、获取输入输出流
 * 3、发送请求
 * 4、关闭socket
 * @author 
 *
 */
public class Client {
	public static void main(String[] args) throws Exception {
		//1、创建socket
		Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 12345);
		//2、获取输入输出流
		InputStream ip = socket.getInputStream();
		OutputStream op = socket.getOutputStream();
		//3、发送请求
		byte[] by = new byte[1024];
		int len = ip.read(by);
		System.out.println(new String(by, 0, len));
		op.write("hello".getBytes());
		//4、关闭socket
		socket.close();
	}

}

 

改善,上面是对字节流的操作,下面直接将字节流转为字符串,操作简单方便(对服务器引入多线程)

Client.java

package com.xue.socket;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;

public class Client {
	public static void main(String[] args) throws Exception {
		Socket socket = new Socket(InetAddress.getLocalHost(), 12345);
		BufferedReader buf = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		PrintStream pr = new PrintStream(socket.getOutputStream());//获得输出流
		pr.println("我爱你");
		System.out.println(buf.readLine());
		socket.close();
	}

}

Server.java

package com.xue.socket;

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

public class Server {
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(12345);
		while (true) {
			final Socket socket = server.accept();		//接受客户端请求
			new Thread() {
				public void run() {						//开启一条线程
					try {
						BufferedReader br = new 
								BufferedReader(new 
										InputStreamReader(socket.getInputStream()));//获得客户端输入流
						PrintStream pr = new PrintStream(socket.getOutputStream());//获得客户端输出流
						String str = br.readLine();
						System.out.println(br.readLine());
						socket.close();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}.start();
		}
	}

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值