网络编程

一曲冷凌霜 提交于 2019-11-30 00:40:35

IP地址(Internet Protocol):唯一标识网络上的每一台计算机

IP地址的组成:32位,由4个8位二进制数组成
二进制不便记忆,所以转换为十进制(最多不能超过255)

IP地址 = 网络地址 + 主机地址
1>网络地址:标识计算机或网络设备所在网段
2>主机地址:标识特定主机或网络设备
在这里插入图片描述

二.IP地址的配置和检测
1.查看IP地址,检测网络是否畅通
1>查看本机的IP地址:ipconfig
2>测试网络是否畅通:ping 目标IP地址

三.DNS域名解析
1.网络服务器:通常指在网络环境下,具有较高计算能力,能够提供用户服务功能的计算机。
在这里插入图片描述

四.网络通信协议
1.网络通信协议:为了在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合
网络分层

五.Socket简介
1.什么是Socket:
在这里插入图片描述
1>通信链路的端点就被称为“套接字”(英文Socket)
2>是提供给应用程序的接口

Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的使用Socket开发而无需了解底层机制。

2.Socket分类:
1>流式套接字(Socket_STREAM):面向连接、可靠的数据传输服务
2>数据报式套接字(SOCK_DGRAM):无连接服务
3>原始式套接字(SOCK_RAW)

六.java.net包
1.java.net包
Socket
ServerSocket
DatagramPacket
DatagramSocket
InetAddress

七.基于TCP协议的Socket编程
1.基于TCP协议的Socket网络通信:用来实现双向安全连接网络通信
2.Socket通信模型:进行网络通信时,Socket需要借助数据流来完成数据的传递工作。
在这里插入图片描述
面向TCP连接的编程
在这里插入图片描述
在这里插入图片描述

传输对象

//用户类
	public class User implements Serializable{
		private String userName;
		private String pwd;
	
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public User(String userName, String pwd) {
		super();
		this.userName = userName;
		this.pwd = pwd;
	}
	
	public String getUserName() {
		return userName;
	}
	
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	public String getPwd() {
		return pwd;
	}
	
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}	
}


//服务器端
public class LoginServer {
	public static void main(String[] args) {
		try {
			ServerSocket serverSocket = new ServerSocket(5000);
			Socket socket = serverSocket.accept();
			InputStream is = socket.getInputStream();
			ObjectInputStream ois = new ObjectInputStream(is);
			User user = (User)ois.readObject();
			System.out.println("客户端说:"+user.getUserName()+"-"+user.getPwd());
			
			
			//给客户端一个响应
			String reply = "欢迎登录!";
			OutputStream os = socket.getOutputStream();
			os.write(reply.getBytes());
			
			os.close();
			ois.close();
			is.close();
			socket.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

//客户端
public class LoginClient {
	public static void main(String[] args) {
		try {
			Socket socket = new Socket("localhost",5000);
			User user = new User("Tom","123456");
			OutputStream os = socket.getOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(os);
			oos.writeObject(user);
			
			socket.shutdownOutput();
			
			//接受服务器端给我的响应
			InputStream is = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String reply;
			while((reply = br.readLine()) != null){
				System.out.println("服务器端说:"+reply);
			}
			
			br.close();
			is.close();
			oos.close();
			os.close();
			socket.close();
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

八.多线程处理多请求:
思路:
服务器:一直监听客户请求,一旦监听到有客户请求,立刻创建一个线程,开启线程。

线程:接受客户请求,给与客户一个响应,线程构造方法中去绑定客户端的Socket

客户端:
发送请求到服务器,接收服务器的响应

如何获得客户端的IP?
InetAddress
在这里插入图片描述

//用户类
public class User implements Serializable{
	private String userName;
	private String pwd;
	
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	
	public User(String userName, String pwd) {
		super();
		this.userName = userName;
		this.pwd = pwd;
	}


	public String getUserName() {
		return userName;
	}


	public void setUserName(String userName) {
		this.userName = userName;
	}


	public String getPwd() {
		return pwd;
	}


	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
	
	
}
//服务器端
public class LoginServer {
	public static void main(String[] args) {
		try {
			ServerSocket serverSocket = new ServerSocket(5000);
			while(true){
			Socket socket = serverSocket.accept();
			LoginThread lt = new LoginThread(socket);
			lt.start();

		}
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}



//线程
public class LoginThread extends Thread{
	private Socket socket;

	public LoginThread(Socket socket) {
		super();
		this.socket = socket;
	}

	public void run() {
		try {
			InputStream is = socket.getInputStream();
			ObjectInputStream ois = new ObjectInputStream(is);
			User user = (User)ois.readObject();
			System.out.println("客户端说:"+user.getUserName()+"-"+user.getPwd());
			
			InetAddress ia = socket.getInetAddress();
			String ip = ia.getHostAddress();
			System.out.println("相应客户端的IP:"+ip);
			
			String reply = "欢迎登录!";
			OutputStream os  = socket.getOutputStream();
			os.write(reply.getBytes());
			
			os.close();
			ois.close();
			is.close();
			socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	
	
	
}


//客户端
public class LoginClient {
	public static void main(String[] args) {
		try {
			
			Socket socket = new Socket("localhost",5000);
			
			User user = new User("Tom","123456");
			
			OutputStream os = socket.getOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(os);
			oos.writeObject(user);
			
			socket.shutdownOutput();
			
			InputStream is = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String reply;
			while((reply = br.readLine()) != null){
				System.out.println("服务器端说:"+reply);
			}
			
			br.close();
			is.close();
			oos.close();
			os.close();
			socket.close();
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

九.基于UDP协议的Socket编程
TCP与UDP的区别:
在这里插入图片描述

基于UDP协议的Socket网络编程步骤:
1>利用DatagramPacket 对象封装数据包
2>利用DatagramSocket 发送数据包
3>利用DatagramSocket 接收数据包
4>利用DatagramSocket处理数据包

基于UDP的Socket通信:

//服务器端
public class LoginServer {
	public static void main(String[] args) {
		//准备了一个空包
		byte[] infos = new byte[1024];
		DatagramPacket dp = new DatagramPacket(infos,infos.length);
		DatagramSocket socket = null;
		//快递点
		try {
			socket = new DatagramSocket(5000);
			//在快递点取礼物
			socket.receive(dp);
			//拆礼物
			String info = new String(dp.getData(),0,dp.getData().length);
			System.out.println("客户端说的话:"+info);
			
			//给客户端一个响应
			String reply = "一件羽绒服";
			byte[] replys = reply.getBytes();
			//客户端地址
			SocketAddress sa = dp.getSocketAddress();
			
			DatagramPacket dp1 = new DatagramPacket(replys,0,replys.length,sa);
			//寄出去
			socket.send(dp1);
			
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			socket.close();
		}
	}
}


//客户端
public class LoginClient {
	public static void main(String[] args) {
		//买礼物
		String info = "心型巧克力";
		byte[] infos = info.getBytes();
		InetAddress ia;
		DatagramSocket socket = null;
		try {
			ia = InetAddress.getByName("localhost");
			DatagramPacket dp = new DatagramPacket(infos,infos.length,ia,5000);
			socket = new DatagramSocket();
			socket.send(dp);
			
			//接受服务器的一个响应
			byte[] replys = new byte[1024];
			DatagramPacket dp1 = new DatagramPacket(replys,replys.length);
			socket.receive(dp1);
			String reply = new String(dp1.getData(),0,dp1.getData().length);
			System.out.println("服务器端的响应:"+reply);
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			socket.close();
		}
	}
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!