java网络编程

一、认识网络

1.网络就是连接在一起可以共享数据和资源的一组计算机。

2.计算机网络分类:局域网,城域网,广域网。

3.ip地址:在网络上使用一种具有层次结构的逻辑地址来标识一台计算机,这个地址就叫做ip地址。

4.ip地址是用来唯一标识网络中的每一台计算机。

5.网络地址:标识计算机网络设备的网段。主机地址:标识特定主机或者网络设备。

6.查看本机ip地址:使用dos命令,winl+R键,输入cmd,进入dos窗口,输入ipconfig,查看到本机ip地址!

7.测试网络连接是否通畅:使用dos命令,winl+R键,输入cmd,进入dos窗口,输入ping +本机ip地址。

二、网络同行协议

TCP协议:中文名叫做传输控制协议。TCP是一种面向连接的,可靠的,基于字符流的传输通信协议。保证数据的安全性!

UDP协议:中文名叫做用户数据报协议。UDP协议是一个无连接协议,不需要连接,不安全!

实现基于TCP协议的Socket编程:

socket就是套接字。位于java.net包,可以监听用户的连接请求。

java.net包的两个类:Socekt类和ServerSocket类。

socket对象是在客户端和服务器之间建立连接。表示客户端

ServerSocket对象是等待客户端建立连接,连接建立以后可以进行同信。

代码如下:

// 客户端

public class LoginClient {
	public static void main(String[] args) throws Exception {
		// 1.发送请求到服务器
		// 创建一个客户端的Socket
		Socket socket = new Socket("localhost",8000);
		// 通过输出流发送请求
		String info = "用户名:Tom;密码:123456";
		OutputStream os = socket.getOutputStream();
		os.write(info.getBytes());

		// 相当于告诉服务器,我说的话说完了
		socket.shutdownOutput(); 
		// 2.通过输入流接收服务器给我的响应
		InputStream is = socket.getInputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		String reply = null;
		while ((reply = br.readLine())!= null) {
			System.out.println("服务器说:" + reply);
		}

		// 关闭资源
		br.close();
		is.close();
		os.close();
		socket.close();
	}
}


//服务器端
public class LoginServer {
	public static void main(String[] args) throws Exception {
		// 接收客户端请求
		// 创建一个服务器端的Socket
		ServerSocket severSocket = new ServerSocket(8000);
		// 使用accept()侦听并接收到此ServerSocket的连接,并用客服端的Socket接收
		Socket socket = severSocket.accept();
		// 通过Socket获得输入流,获得用户的请求,用字节流输入流接收
		InputStream is = socket.getInputStream();
		// 将字节流包成字符流,字符流包成缓冲流
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		String info = null;
		while ((info = br.readLine())!= null) {
			System.out.println("客户端说:" + info);
		}

		// 给客户端响应
		String reply = "欢迎登录!";
		// 通过输出流发送给客户端
		OutputStream os = socket.getOutputStream();
		os.write(reply.getBytes());
		
		socket.shutdownOutput();
		Thread.sleep(1000);
		
		
		// 释放相应资源
		os.close();
		br.close();
		is.close();
		socket.close();
		severSocket.close();

	}
}

//注意:在连接完成之后,一定要记得关闭资源,先开的后关,后开的先关。

当然,还可以传递对象信息,进行序列化和反序列化操作就可以。

实现多客户端用户登录,采用多线程的方式,可以在服务端创建一个专门负责监听的应用服务程序,一个专门负责响应的线程程序。

代码如下:

//服务端
public class Sever {
	public static void main(String[] args) throws Exception {
		//建立连接,指定端口开始监听
		ServerSocket serverSocket=new ServerSocket(8000);
		//声明socekt
		Socket socket=null;
		//使用循环,监听一直存在,只要发起请求,就去响应
		while(true) {
			socket=serverSocket.accept();	//使用accept()方法等待客户端发起同信
			MyThread my=new MyThread(socket);
			my.start();
		}
	}
}

//客户端:这里只是创建了一个客户端,可以多创建几个客户端,方便测试!
public class Client {
	public static void main(String[] args) throws Exception{
		//建立客户端连接
		Socket socket=new Socket("localhost",8000);
		//打开输入流,输出流
		OutputStream os=socket.getOutputStream();
		InputStream is=socket.getInputStream();
		
		//发起客户端登录信息,就是向输出流写入信息
		String info="用户名:Jack;密码:456123";
		os.write(info.getBytes());
		//相当于告诉服务器,我说的话已经说完了
		socket.shutdownOutput();
		
		//接收服务端的响应
		String reply=null;
		BufferedReader br=new BufferedReader(new InputStreamReader(is));
		while((reply=br.readLine())!=null) {
			System.out.println("我是客户端,服务器响应是:"+reply);
		}
		
		
		//关闭资源
		br.close();
		is.close();
		os.close();
		socket.close();
		
	}
}

//创建线程类
public class MyThread extends Thread{

	public Socket socket;		//对象属性
	
	/**
	 * 有参构造,传递socket属性过来,没启动一个线程,连接对应的Socket
	 * @param socket
	 */
	public MyThread(Socket socket) {
		this.socket = socket;
	}


	public void run() {
		InputStream is=null;
		OutputStream os=null;
		BufferedReader br=null;
		try {
			//读操作
			is=socket.getInputStream();
			
			//获取客户端信息
			br=new BufferedReader(new InputStreamReader(is));
			String info=null;
			while((info=br.readLine())!=null) {
				System.out.println("我是服务器,客户端登录信息为:"+info);
			}
			
			//给客户端一个响应,
			os=socket.getOutputStream();
			String reply="欢迎你,登录成功!";
			
			os.write(reply.getBytes());
			
			
			socket.shutdownOutput();
			Thread.sleep(2000);
			
		} catch (Exception e) {
				e.getStackTrace();
		} finally {
			//关闭资源
			try {
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				is.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			try {
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}
	
}

注意:这里的服务器处于一直监听客户端请求,一旦监听到客户请求,就立即去创建一个线程。
线程是接纳客户请求,给予客户一个响应,利用线程的构造方法去绑定客户端的socket。
客户端是发送请求到服务器,接收服务器的响应。

TCU协议和UDP协议的区别

协议TCPUDP
是否连接面向连接无连接
传输可靠性(安全)可靠不可靠
连接速度

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值