黑马程序员__java基础__网络编程

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
网络编程概述
一.网络模型
(1)分为 OSI参考模型和TCP/IP 参考模型。图形表示:

(2)般来说开发处于传输层和网际层;应用层为:FTPHTTP协议等;传输层为:UDPTCP等;网际层为:IP
(3)OSI参考模型虽然设计精细,但过于麻烦,效率不高,因此才产生了简化版的TCP/IP参考模型。
二. 网络通讯要素
(1) IP地址:
         网络中设备的标识;不易记忆,可用主机名本地回环地址:127.0.0.1 主机名:localhost。
         如何获取任意一台主机的IP地址对象:
         1.InetAddress对象。
         2.对于任意主,需要指定传入主机名的参数。
示例:
import java.net.*;
public class IPDemo 
{
	public static void main(String[] args) throws Exception 
	{
		//获取本类对象的IP信息
		InetAddress i=InetAddress.getLocalHost();
		String address=i.getHostAddress();//获取IP地址
		String name=i.getHostName();//获取主机名
		System.out.println("IP="+address+"\t"+"name="+name);
		//获取指定IP地址的IP信息
		InetAddress ia=InetAddress.getByName("192.168.137.1");
		String address1=ia.getHostAddress();
		String name1=ia.getHostName();
		System.out.println("IP="+address1+"\t"+"name="+name1);
		//获取指定主机名的IP信息
		InetAddress iad=InetAddress.getByName("www.poxiao.com");
		String address2=iad.getHostAddress();
		String name2=iad.getHostName();
		System.out.println("IP="+address2+"\t"+"name="+name2);
	}
}
(2) 端口号
        1.用于标识进程(应用程序)的逻辑地址,不同进程的标识。
        2. 有效端口:0~65535,其中0~1024系统使用或保留端口。
(3)传输协议:
        通讯的规则,常见协议:UDP、TCP。
UDP协议
一.UDP协议的特点
(1)将数据及源和目的封装成数据包中,不需要建立连接。
(2)每个数据报的大小在限制在64k内。
(3)因无连接,是不可靠协议。
(4)不需要建立连接,速度快。
二.UDP传输
(1)方法:
         1. UDPSocket发送服务对象:DatagramSocket(),不指定端口。DatagramSocket(int port),指定端口。
         2.发送void  send(DatagramPacket  p)。
         3.接收void  receive(DatagramPacket  p)。
(2)发送数据:
         1.UDPSocket服务,在此无需指定端口,也可以将端口加入。
         2.提供数据,并将数据封装到数据包中。
         3.通过socket服务的发送功能,将数据包发送出去。
         4.关闭资源。
(3)接收数据:
         1.定义 UDPSocket服务。通常会监听一个端口。
         2.定义一个数据包,用来存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
         3. 通过 socket 服务的 receive 方法接收到的数据存入已定义好的数据包中。
         4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。
         5.关闭资源。
(4)示例:
import java.net.*;
//发送端
public class UdpSocketSend
{
	public static void main(String[] args)throws Exception
	{
		//创建udp服务。(找邮局)
		DatagramSocket ds=new DatagramSocket();
		//提供数据,并打包
		byte[] buf="wo zai xue xi java".getBytes();
		DatagramPacket dp=
					new DatagramPacket(buf,buf.length, InetAddress.getByName("192.168.137.1"), 60812);
		//通过socket服务将数据发送出去,使用send方法
		ds.send(dp);
		//关闭资源
		ds.close();
	}
}
//接收端
class UdpSocketReceive
{
	public static void main(String[] args) throws Exception
	{
		//创建udp socket服务(接收端)
		DatagramSocket ds=new DatagramSocket(60812);
		//定义数据包,用于存储数据
		byte[] buf=new byte[1024];
		DatagramPacket dp=new DatagramPacket(buf,buf.length);
		//通过服务的receive方法接收数据存入数据包中
		ds.receive(dp);
		//通过数据包的方法获取其中的数据
		String ip=dp.getAddress().getHostAddress();
		String data=new String(dp.getData(),0,dp.getLength());
		int port=dp.getPort();
		System.out.println("ip:"+ip+"  "+"data:"+data+"  "+"port:"+port);
		ds.close();
	}
}
(4)键盘输入,发送数据:
import java.net.*;
import java.io.*;
public class UdpSend
{
	public static void main(String[] args)throws Exception
	{
		//创建udp服务。
		DatagramSocket ds=new DatagramSocket();
		
		DatagramPacket dp=null;
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String line=null;
		while((line=br.readLine())!=null)
		{
			byte[] buf=line.getBytes();
			//提供数据,并打包
		 	dp=new DatagramPacket(buf,buf.length, InetAddress.getByName("192.168.137.1"), 60812);
			ds.send(dp);//通过socket服务将数据发送出去,使用send方法
			if("over".equals(line))
				break;	
		}
		ds.close();//关闭资源
	}
}
class UdpReceive
{
	public static void main(String[] args) throws Exception
	{
		//创建udp socket服务(接收端)
		DatagramSocket ds=new DatagramSocket(60812);
		//定义数据包,用于存储数据
		while(true)
		{	byte[] buf=new byte[1024];
			DatagramPacket dp=new DatagramPacket(buf,buf.length);
			//通过服务的receive方法接收数据存入数据包中
			ds.receive(dp);
			//通过数据包的方法获取其中的数据
			String ip=dp.getAddress().getHostAddress();
			String data=new String(dp.getData(),0,dp.getLength());
			int port=dp.getPort();
			System.out.println("ip:"+ip+"  "+"data:"+data+"  "+"port:"+port);
		}
	}
}
TCP协议
一.TCP协议的特点
(1) 建立连接,形成传输数据的通道。
(2)在连接中进行大数据量传输。
(3)通过三次握手完成连接,是可靠协议。
(4)必须建立连接,效率会稍低。
二.TCP传输
(1)TCP分客户端和服务端。客户端对应的对象是Socket,服务端对应的对象是ServerSocket
(2)TCP客户端:
        1.客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。
        2.连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出            流对象,通过getInputStream(),getOutputStream()获取即可。
        3.与服务端通讯结束后,关闭Socket。
(3)TCP服务端:
        1.服务端需要明确它要处理的数据是从哪个端口进入的。
        2.当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行              数据传输。
        3.当该客户端访问结束,关闭该客户端。
(4)服务端和客户端交互示例:
import java.net.*;
import java.io.*;
class  TcpClient
{
	public static void main(String[] args) throws Exception
	{
		//1、创建客户端的Socket服务。指定目的主机和端口
		Socket s=new Socket("192.168.137.1",10005);
		//2、获取Socket流中输出流,发送数据
		OutputStream out=s.getOutputStream();
		out.write("你好!".getBytes());
		//3、获取Socket流中的输入流,用来接收服务端的反馈信息并打印
		InputStream in=s.getInputStream();
		byte[] buf=new byte[1024];
		int len=in.read(buf);//读取反馈的数据
		System.out.println(new String(buf,0,len));//输出接收的数据
		s.close();//关闭资源
	}
}
//服务端
class TcpServer
{
	public static void main(String[] args)throws Exception
	{
		//1、创建服务端的Socket服务,并监听一个端口
		ServerSocket ss=new ServerSocket(10005);
		//2、通过accept方法获取连接过来的客户端对象。
		Socket s=ss.accept();
		//获取客户端ip
		String ip=s.getInetAddress().getHostName();
		System.out.println(ip);
		//3、获取对应客户端对象的读取流读取发过来的数据,并打印
		InputStream in=s.getInputStream();
		byte[] buf=new byte[1024];
		int len=in.read(buf);
		System.out.println(new String(buf,0,len));
		//4、调用对应的客户端的输出流写入返回数据
		OutputStream out=s.getOutputStream();
		out.write("收到!".getBytes());
		//关闭资源
		s.close();
		ss.close();
	}
}
(5) 服务端和客户端 文本转换:
import java.net.*;
import java.io.*;
class  TcpClient
{
	public static void main(String[] args) throws Exception
	{
		//创建Socket服务
		Socket s=new Socket("192.168.137.1",10005);
		//定义读取键盘数据的流对象
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		//定义目的,将数据写入到Socket输出流。发给服务端
		PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
		//定义一个Socket读取流,读取服务端返回的大写信息。
		BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));
		String line=null;
		while ((line=br.readLine())!=null)
		{
			
			if("over".equals(line))
				break;
			pw.println(line);//将数据写入流中
			String data=brin.readLine();//读取返回的信息
			System.out.println(data);
		}
		br.close();//关流
		s.close();
	}
}

//服务端
class TcpServer
{
	public static void main(String[] args)throws Exception
	{
		//创建服务端的ServerSocket服务,并指定监听端口
		ServerSocket ss =new ServerSocket(10005);
		//获取客户端连接
		Socket s=ss.accept();
		//获取客户端ip
		System.out.println(s.getInetAddress().getHostName()+" connected.......");
		//读取Socket读取流中的数据
		BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));
		//将大写数据写入到Socket输出流,并发送给客户端。
		PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
		String line=null;
		while ((line=brin.readLine())!=null)
		{
			System.out.println(line);
			pw.println(line.toUpperCase());//将读到数据转换为大写后返回
		}
		s.close();//关流
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值