首页 > 学院 > 开发设计 > 正文

14网络(tcp/udp)

2019-11-06 06:54:28
字体:
来源:转载
供稿:网友

tcp(socket)

tcp:传送数据安全,丢包会从发(速度慢)

网络编程要有服务器端,客户端

直接看栗子:服务器端:

/* * 服务器端: * 用ServerSocket来创建服务器端,用Socket来连接两端(socket可以说就是一个连接两端的管道) * 1,创建服务器端口,端口号不要使用1024以下的 * 2,监听接受到的客户端(一般服务器是不能停止的,需要不停的监听连接的客户端,可以用个死循环) * 3,两端的数据通信:getInputStream(),getOutputStream()可以获取Soket中的输入流和输出流,可以用 * 输入流和输出流来相互传送数据 * 4,最后要关闭ServerSocke和连接的Socket。 *  * ★关闭的最佳方法:当客户端要关闭时,先给服务器发送一条要关闭,这时服务器在释放资源,释放完再给客户端 * 传回资源释放完毕的消息,这是客户端接受到消息时在关闭连接socket(管道)。 * */class TcpServer{	public static void main(String[] args) {		ServerSocket ss =null;		Socket s = null;	//接收到的客户端		//输入流和输出流		BufferedReader br = null;		PRintWriter pw = null;				try {			//1,创建服务器端口			ss = new ServerSocket(9999);			//死循环不停的监听			while(true){				try {					//2,接收连接的客户端放在s中					s = ss.accept();										//3,获取socket中的输入流和输出流					//br是字符流,getInputStream()是字节流,需要使用转换流					//pw是有带缓冲的,需要用true来刷新					br = new BufferedReader(new InputStreamReader(s.getInputStream()));					pw = new PrintWriter(s.getOutputStream(),true);										//我这里是不停的读取客户端传来的数据					//然后将接受到的数据在传给客户端					String str = null;					while((str=br.readLine())!=null){	//br读取数据						//★最佳关闭方法:						//接受到客户端quit是客户端要关闭socket						if(str.trim().equals("quit")){							//在这里可以释放资源														//释放完给客户端发条可以关闭的消息							pw.println("finish");						}												System.out.println(str);						//在用输出流pw发送消息						pw.println("Server: "+str);					}										//4,在这用try,catch来包裹接收到客户端,端着个客户端socke(管道)关闭时,在这里来关闭服务的socket(管道)				}catch (SocketException e) {	//这里可以在捕获一个socke异常,判断客户端socket是否是非法关闭					System.err.println("客户端关闭异常");				} catch (IOException e) {					e.printStackTrace();				}finally{					if(s!=null)s.close();				}			}			//		} catch (IOException e) {			e.printStackTrace();		}finally{			//当服务器停止时,关闭服务器			try {				if(ss!=null)ss.close();			} catch (IOException e) {				e.printStackTrace();			}		}	}}

客户端:

/* * 客户端: * 1,建立连接服务的socket(管道),需要本机ip地址和服务器的端口号 * 可以用InetAddress获取本机ip地址 * 2,两端的数据通信:getInputStream(),getOutputStream()可以获取Soket中的输入流和输出流,可以用 * 输入流和输出流来相互传送数据 * 3,关闭socket *  * ★关闭的最佳方法:当客户端要关闭时,先给服务器发送一条要关闭,这时服务器在释放资源,释放完再给客户端传回 * 资源 释放完毕的消息,这是客户端接受到消息时在关闭连接socket(管道)。 * */class TcpClient{	public static void main(String[] args) {		Socket s = null;		BufferedReader br = null;		PrintWriter pw = null;		//专门读取键盘输入的流		BufferedReader keyBr = null;				try {			//获取本机ip			InetAddress ipd = InetAddress.getLocalHost();			String ip = ipd.getHostAddress();			//1,连接服务器			s = new Socket(ip, 9999);			//2,绑定输入输出流			br = new BufferedReader(new InputStreamReader(s.getInputStream()));			pw = new PrintWriter(s.getOutputStream(),true);//记得要多加个参数刷新						//我这里来读取键盘的输入发送给服务器,需要在创建一个输入流			//用的是字符流读取键盘输入,标准输入流失字节流,需要转换流			keyBr = new BufferedReader(new InputStreamReader(System.in));			String str = null;			while((str=keyBr.readLine())!=null){				//向服务器发送消息				pw.println(str);								//读取服务器的消息(其实这可用另一条线程来单独读取更好)				String strs = br.readLine();				//★最佳关闭方法				//接受到可以关闭消息是就break掉,退出循环				if(strs.trim().equals("finish")){					break;				}				System.out.println(strs);			}					}catch (SocketException e) {	//服务器关闭异常			System.err.println("~~~~~~~~~~~服务器断开连接!!!!");		} catch (UnknownHostException e) {				e.printStackTrace();		} catch (IOException e) {			e.printStackTrace();		}finally{			//关闭socket			try {				if(s!=null)s.close();			} catch (IOException e) {				e.printStackTrace();			}			//注意的是这笔还要关闭keyBr,因为这个keyBr是读取键盘输入的流,没有跟socke绑定			//所以socke关闭时,这个流不会关闭,需要另外关闭			try {				if(keyBr!=null)keyBr.close();			} catch (IOException e) {				e.printStackTrace();			}		}	}}

udp

udp传送数据不可靠,会丢包(但速度快)

udp不用流接收和发送数据

栗子:服务器端:

/* * 服务器端: * 1,用DatagramSocket创建通道 * 2,两端的通信用:创建DatagramPacket数据接收包和发送包 * 3,用receive()方法接收包,send()发送包 * 4,关闭 * */class UdpServer{	public static void main(String[] args) {		DatagramSocket ds = null;				try {			//1,创建连接端口			ds = new DatagramSocket(5858);						//2,创建接受送包,并将客户端的数据存放在bytr[]缓冲区中			byte[] buf = new byte[1024];			DatagramPacket receivrdp = new DatagramPacket(buf, buf.length);			//接收数据,用getData()获取缓冲区数据,返回的是byte[]			ds.receive(receivrdp);			String str = new String(receivrdp.getData(),0,receivrdp.getLength());	//将字符转换成字符串			System.out.println(str);						//3,创建发送包			//只能发送byte[]类型的数据,所以需要转换			SocketAddress ip = receivrdp.getSocketAddress();			String strs = "我是服务器!!!";			byte[] by = strs.getBytes();			DatagramPacket dp = new DatagramPacket(by, by.length,							ip);				//发送数据			ds.send(dp);						//		} catch (SocketException e) {			e.printStackTrace();		} catch (IOException e) {			e.printStackTrace();		}finally{			//关闭通道			if(ds!=null)ds.close();		}	}}客户端:
/* * 客户端 * */class UdpClien{	public static void main(String[] args) {		DatagramSocket ds = null;				try {			//1创建通道			ds = new DatagramSocket(6868);						//获取本机ip			InetAddress ipd = InetAddress.getLocalHost();			String ip = ipd.getHostAddress();			//2,创建发送包			//只能发送byte[]类型的数据,所以需要转换			String str = "hello";			DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length,							new InetSocketAddress(ip, 5858));				//发送数据			ds.send(dp);						//3,创建接受送包,并将客户端的数据存放在bytr[]缓冲区中			byte[] buf = new byte[1024];			DatagramPacket receivrdp = new DatagramPacket(buf, buf.length);			//接收数据,用getData()获取缓冲区数据,返回的是byte[]			ds.receive(receivrdp);			String strs = new String(receivrdp.getData(),0,receivrdp.getLength());	//将字符转换成字符串			System.out.println(strs);					} catch (SocketException e) {			e.printStackTrace();		} catch (IOException e) {			e.printStackTrace();		}	}}


上一篇:JDK、JRE、JVM

下一篇:ThreadLocal源码分析

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表