黑马程序员——网络编程

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、网络模型:

1、OSI和TCP/IP模型:

2、网络通讯要素:

IP地址:本地回环地址:127.0.0.1,主机名:localhost

端口号:有效端口:0-65535    0-1024为系统使用或保留端口(用于标识应用程序)

传输协议:常见协议:TCP, UDP

二、UDP和TCP

1、UDP:将数据封装在数据包,不用建立连接

  每个数据包限制在64k

  不可靠协议(因为无连接)

                 不用建立连接,速度快

2、TCP:建立连接,形成传输的通道

                 进行大量数据传输

 可靠协议

                 效率低

 //获取本地主机ip地址对象
		InetAddress ip = InetAddress.getLocalHost();
		//获取其他主机ip
		ip = InetAddress.getByName("zhuji");   //通过主机名获取
		ip = InetAddress.getByName("192.16.56.2");
		
		System.out.println(ip.getHostAddress()); //获取主机地址
		System.out.println(ip.getHostName());    //获取主机名

三、socket :为网络服务提供的一个机制

通信两端都有socket

网络通信就是socket间通信

1、UDP传输:

发送数据

<span style="white-space:pre">		</span>//建立udp的socket服务
		DatagramSocket ds = new DatagramSocket();
		//将发送数据封装到数据包
		String string = "信息";
		byte[] buf = string.getBytes();
		DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("172.16.56.6"),10000);
		//将数据包发送出去
		ds.send(dp);
		//关闭socket服务
		ds.close();
接收数据:

<span style="white-space:pre">		</span>//建立udp socket连接
		DatagramSocket ds = new DatagramSocket();
		//建立数据包,用于接收数据
		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf, buf.length);
		//使用socket服务的receive,将数据存到数据包
		ds.receive(dp);
		//解析数据包数据
		String ip =dp.getAddress().getHostAddress();  //ip
		int port = dp.getPort(); //端口
		String text = new String(dp.getData(),0,dp.getLength());
		//关闭资源
		ds.close();
2、TCP传输 Socket和ServerSocket

客户端-->服务端:

//创建socket客户端,明确目的地和要连接的主机
		Socket sk = new Socket("172.16.56.5",1000);
		//通过getOutputStream()和getInputStream()获取字节流
		//获取输出流
		OutputStream out = sk.getOutputStream();
		//使用输出流,将数据写出
		out.write("hehe".getBytes());
		//关闭资源
		sk.close();
服务端:
接收客户端发送的数据

	        //创建服务端socket对象,ServerSocket,服务端提供端口
		ServerSocket ss = new ServerSocket(10000);
		//获取客户端对象
		Socket st= ss.accept();
		//通过socket对象获取输入流,读取客户端数据
		InputStream in = st.getInputStream();
		byte[] buf = new byte[1024];
		int len =0;
		while ((len=in.read(buf))!=-1) {
			String text = new String(buf,0,len);
			System.out.println(text);
		}		
		//获取ip地址
		String ip = st.getInetAddress().getHostAddress();
		//关闭客户端,关闭服务端
		st.close();
		ss.close();
3、服务端读取数据,并返回数据至客户端:

//1创建服务端对象。
ServerSocket ss = new ServerSocket(10002);
//2,获取连接过来的客户端对象。
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
//3,通过socket对象获取输入流,要读取客户端发来的数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(ip+":"+text);
//使用客户端socket对象的输出流给客户端返回数据
OutputStream out = s.getOutputStream();
out.write("收到".getBytes());
s.close();创建英文大写转换服务器
ss.close();
4、练习:创建英文大写转换服务器

<span style="white-space:pre">		</span>//创建socket客户端对象
		Socket sk = new Socket("172.15.65.3",10000);
		//获取键盘录入
		BufferedReader br = new BufferedReader(new InputStreamReader((System.in)));
		//目的 socket输出流
		PrintWriter out = new PrintWriter(sk.getOutputStream(),true);
		//读取服务端返回的大写数据
		BufferedReader bufr = new BufferedReader(new InputStreamReader(sk.getInputStream()));
		String line = null;
		while ((line =br.readLine())!=null) {
			if("over".equals(line)){
				break;
			}
			out.print(line);
			//读取服务端发回的数据
			String up1=bufr.readLine();
			System.out.println(up1);
		}
	
		sk.close();
	<span style="white-space:pre">	</span>ServerSocket ss = new ServerSocket(10000);
		//获取socket对象
		Socket st= ss.accept();
		String ipString =st.getInetAddress().getHostAddress();
		//读取客户端发过来的数据,显示在控制台
		BufferedReader br = new BufferedReader(new InputStreamReader(st.getInputStream()));
		//获取输出流
		PrintWriter pw = new PrintWriter(st.getOutputStream());
		//转换成大写发给客户端
		String line =null;
		while ((line =br.readLine())!=null) {
			System.out.println(line);
			pw.write(line.toUpperCase());
		}
		
		st.close();
		ss.close();









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值