-网络编程概述
网络模型:1、OSI(Open System Interconnection 开放系统互连)参考模型
2、TCP/IP 参考模型
网络通信要素:
1、IP地址
2、端口号
3、传输协议
-网络参考模型
OSI参考模型:应用层,表示层、会话层、传输层、网络层、数据链路层、物理层(分7层)
TCP/IP参考模型:应用层、传输层、网际层、主机至网络层(分4层)
-网络通信要素
IP地址:InetAddress
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0~1024一般是系统使用或保留的端口
传输协议
通信的规则
常见协议:TCP/IP、UDP、
-TCP与UDP
TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、可用于传输大量数据 (流 模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
TCP协议常用于:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协 议)。TCP用于传输数据量大,可靠性要求高的应用。
UDP:面向非连接、传输不可靠、用于传输少量数据(<64K数据包模式)、速度快。
UDP协议常用于:即时聊天应用、视频会议、桌面共享等。
-获取IP地址、主机名等信息的代码例子
package day23_NetworkProgramming; import java.net.InetAddress; //学习InetAddress public class Day23_04_InetAddress { public static void main(String[] args) throws Exception { InetAddress i = InetAddress.getLocalHost(); System.out.println(i.toString()); System.out.println("address:"+i.getHostAddress()); System.out.println("name:"+i.getHostName()); InetAddress ia = InetAddress.getByName("www.baidu.com"); System.out.println("address:"+ia.getHostAddress()); System.out.println("name:"+ia.getHostName()); } }
-Socket概要
1、socket就是为网络服务提供的一种机制
2、通信两端都要有Socket
3、网络通信其实就是Socket间的通信
4、数据在两个socket间通过IO传输
-通过upd服务发送数据
需求:通过udp传输方式,将一段文件数据发送出去。
分析步骤:
1、建立updsocket服务
2、提供要发送的数据,并将数据封装到数据包中
3、通过socke服务的发送功能(send()方法),将数据发送出去
4、关闭资源
[b][/b]
import java.net.*; public class Day23_07_UdpSendDemo { public static void main(String[] args) throws Exception { //1、创建upd服务,通过DatagramSocket对象 DatagramSocket ds = new DatagramSocket();//可以给该程序指定一个端口 //2、确定发送数,并封装成数据包。 //DatagramPacket(byte[] buf,int length,InetAddress address,int port) byte[] buf = "data send by udp".getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("10.0.7.213"), 10000); //3、通过socket服务,使用send()方法将已有的数据包发送出去 ds.send(dp); //4、关闭资源 ds.close(); } }
-学习通过upd接收端接收数据
需求:定义一个应用程序,用于接收udp协议传输的数据并做相关处理。
分析步骤:
1、定义udp socket方法;通常会监听一个端口,作用其实就是方便于明确那些数据
过来是该应用程序可以处理的。
2、定义一个数据包,用于存储接收到的数据。(数据包中有更多功能可以提取字节数据
中的不同数据信息)
3、通过socke服务的receive()方法将接收到的数据存入已定义好的数据包中。
4、通过数据包对象的特有功能,将这些不同的数据去程,打印在控制台。
5、关闭资源
import java.net.*; public class Day23_08_UdpReceiveDemo { public static void main(String[] args) throws Exception { //1、创建upd socket,建立端点 DatagramSocket ds = new DatagramSocket(10000);//监听10000端口 //2、定义数据包,用于存储数据 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); //3、通过服务的receive()方法将接收到的数据存入到数据包中 ds.receive(dp); //4、通过数据包的方法获取其中的数据 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); int port = dp.getPort(); System.out.println(ip+"::"+data+"::"+port); //5、关闭资源 ds.close(); } }
-通过upd协议发送接收端接收数据方式二
接收端代码:
package day23_NetworkProgramming; import java.net.*; public class Day23_09_UdpReceiveDemo2 { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(10001); while(true){ byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); 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+"::"+data+"::"+port); } } }
发送端代码:
package day23_NetworkProgramming; import java.io.*; import java.net.*; /** * 学习通过upd服务发送数据(通过键盘录入数据) * @author Administrator * */ public class Day23_09_UdpSendDemo2 { public static void main(String[] args) throws Exception { //1、创建upd服务,通过DatagramSocket对象 DatagramSocket ds = new DatagramSocket(); //2、确定发送数,并封装成数据包。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while((line=br.readLine())!=null){ if("88".equals(line)) break; byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("10.0.7.213"), 10001); //3、通过socket服务,使用send()方法将已有的数据包发送出去 ds.send(dp); } //4、关闭资源 ds.close(); } }
练习:建立一个文本转换服务器,实现客户端给服务端发送文本,服务端将文本
转换成大写后返回给客户端。客户端可以不断的输入,当输入over时,
结束转换。
分析步骤:
1、建立服务
2、获取键盘录入数据
3、将数据发送给服务端
4、服务端给客户端返回转换后的数据
5、转换结束,关闭资源
接收端:
package day23_NetworkProgramming; import java.net.*; import java.io.*; //服务端 class Day23_13_TCPTransPracticeServer { public static void main(String[] args) { ServerSocket ss = null; Socket s = null; try { ss = new ServerSocket(10005); s = ss.accept(); //读取socket流中的数据 BufferedReader socketBr = new BufferedReader(new InputStreamReader(s.getInputStream())); //通过socket流 将转换后的数据发送回客户端 //BufferedWriter socketBw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); PrintWriter socketPw = new PrintWriter(s.getOutputStream(),true); String line = null; while((line=socketBr.readLine())!=null){ System.out.println(line); //socketBw.write(line.toUpperCase()); //socketBw.newLine(); //socketBw.flush(); socketPw.println(line.toUpperCase()); } } catch (Exception e) { e.printStackTrace(); } finally { try { s.close(); ss.close(); } catch (IOException e) { e.printStackTrace(); } } } }
发送端:
package day23_NetworkProgramming; import java.net.*; import java.io.*; //客户端 class Day23_13_TCPTransPracticeSend { public static void main(String[] args) { try { Socket s = new Socket("10.0.7.213", 10005); //定义读取键盘数据的流对象 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //定义目的,将数据写入到socket输出流中,发送给服务端 //BufferedWriter socketBw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); PrintWriter socketPw = new PrintWriter(s.getOutputStream(),true); //定义一个socket读取流,读取服务端返回转换后的数据 BufferedReader socketBr = new BufferedReader(new InputStreamReader(s.getInputStream())); String line = null; while((line=br.readLine())!=null){ if("over".equals(line)) break; //socketBw.write(line); //socketBw.newLine(); //socketBw.flush(); socketPw.println(line); //服务端返回转换后的数据 String str = socketBr.readLine(); System.out.println("server: "+str); } } catch (Exception e) { e.printStackTrace(); } } }
-练习:通过TCP的网络传输复制一个文本文件
具体代码如下:
package day23_NetworkProgramming; import java.net.*; import java.io.*; //服务端 class Day23_14_CopyByTCPPracticeServer { public static void main(String[] args) throws Exception { ServerSocket ss = new ServerSocket(10006); Socket s = ss.accept(); //显示客户端连接的ip String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+"......connected"); BufferedReader socketBr = new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter pw = new PrintWriter(new FileWriter("copyByTCP.txt"),true); String line = null; while((line=socketBr.readLine())!=null){ pw.println(line); } PrintWriter socketPw = new PrintWriter(s.getOutputStream(),true); socketPw.println("上传成功"); pw.close(); s.close(); ss.close(); } }
package day23_NetworkProgramming; import java.net.*; import java.io.*; //客户端 class Day23_14_CopyByTCPPracticeClient { public static void main(String[] args) throws Exception { Socket s = new Socket("10.0.7.213",10006); BufferedReader br = new BufferedReader(new FileReader("demo.txt")); PrintWriter pw = new PrintWriter(s.getOutputStream(),true); String line = null; while((line=br.readLine())!=null){ pw.println(line); } s.shutdownOutput(); BufferedReader socketBr = new BufferedReader(new InputStreamReader(s.getInputStream())); String str = socketBr.readLine(); System.out.println(str); br.close(); pw.close(); s.close(); } }