黑马程序员 学习日记(四)

来源:互联网 发布:彩票大数据分析 编辑:程序博客网 时间:2024/06/05 15:46
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

关于网络编程

        现在是网络时代,身为程序猿怎么能不掌握网络编程呢?网络编程实际上就是指socket编程。

1.UDP和TCP的介绍

        两台计算机进行连接交换数据就形成了网络。计算机之间的通讯是遵循固有的规则和协议的,有UPDTCP两种协议。

        UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。看到这么长概念是不是头晕?我也晕。。。只需要记住UDP的特点,发送方只要把数据发出去了就不管了,我不管你收不收到,就像寄快件一样,我有东西和地址我就交给快递员去发送去,也就是说数据很大可能丢失。

        当你需要确定对方到底收到没有的时候就要使用TCP协议。TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议,由IETF的RFC 793说明(specified)。TCP在IP报文的协议号是6。

概念就介绍到这里,我们通过敲代码进一步去熟悉这两个协议。

2.在Java中的简单实现

通用通信步骤:

  1. 建立通信两端:UDP(send和receive)、TCP(client和server)
  2. 建立数据包
  3. 进行数据流通信
  4. 关闭

(1)UDP通信

Java里通过DatagramPacket对象把数据封装成包发送,接收端使用DatagramSocket对象来读取数据包。那么我们就可以定义两个类,一个send,一个receive,让这两个类进行一次UDP通信。
class Send {public static void main(String[] args) throws Exception{//创建UDP服务DatagramSocket ds = new DatagramSocket() ;//通过键盘录入,创建数据BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)) ;String line = null ;while ((line = bufr.readLine())!=null){if ("886".equals(line)){break ;}byte[] buf = line.getBytes() ;//将数据打包DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("127.0.0.1"),10001) ;//发送出去ds.send(dp) ;}ds.close() ;}}

编译无错即可执行(为了方便没有进行异常捕获,全部抛出)。使用UDP必须开启UDP服务。
new DatagramPacket(字节数据, 要发送的数据长度, 目的IP地址, 目的地端口) ;
打包数据必须提供以上的参数。
发送端我们已经有了,还缺一个接收端,执行上面的程序不会有任何反应→_→

接着写一个接收端
class Receive{public static void main(String args[]) throws Exception{//第一步还是建立UDP服务DatagramSocket ds = new DatagramSocket() ;while (true){byte[] buf = new byte[1024] ;  //数据不多,1024足矣。//建立数据包,现在暂时为空DatagramPacket dp = new DatagramPacket(buf, buf.length) ;//接收一次数据,填进数据包里ds.receive(dp) ;String ip = dp.getAddress().getHostAddress() ;//getData()返回字节数组,用字符串对象转换为字符串。String data = new String(dp.getData(), 0, dp.getLength()) ;System.out.println(ip + "...." + data) ;}}//接收服务为了能随时接收数据需要保持开启。}

还请各位不了解的同学仔细看注释。
现在两端都有了,请先执行接收端再运行发送端。UDP特性,你如果先运行发送端,你发送的数据都将丢失。
(开启两个CMD,分别运行两个类即可)关于IP和端口的概念这里就不多阐述了,请大家自行搜索。
如无意外,应该是:
send控制台:hello world! ------------------------------receive控制台:127.0.0.1....hello world!
send控制台:I love Java ------------------------------receive控制台:127.0.0.1....I love Java
send控制台:over       (已关闭服务)     ------------------------------receive控制台:    (服务保持开启)
这样的一种对话状态。
好了这就是UDP的通信,是不是非常简单。有了UDP的经验,再看TCP也不会有难度。

(2)TCP通信

TCP是可靠的协议,可靠来源就是要有一个服务端,只有确认连接上服务端的客户端才能与服务端通信。就如同打电话,拨打10086,如果你不在信号范围内这个电话根本无法打通。
首先建立一个服务端
class Server{public static void main(String args[]) throws Exception{                //建立服务时确立使用的端口,所有客户端只有找到这个端口才能连接此服务ServerSocket ss = new ServerSocket(10004) ;                //接收一个客户端进来,阻塞式方法,没有客户端连进来就会一直等待。Socket s = ss.accept() ;                //获取IPString ip = s.getInetAddress().getHostAddress() ;System.out.println(ip + "....has connected") ;                //从网络流里读取数据、发送数据,网络流对象我们直接可以获取。BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())) ;String line = null ;while ((line=br.readLine())!= null){bw.write(line.toUpperCase()) ;bw.newLine() ;bw.flush();}s.close() ;ss.close() ;}}
跟UDP接收端不同的地方很多,数据都是以流的方式进行通信,对于流的操作详情请参考IO流。

再来一个客户端
class Client{public static void main(String args[]) throws Exception{//确定目标IP和端口,建立socket服务Socket s = new Socket("192.168.56.1", 10004) ;//键盘输入BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;//获得socket提供的输出流和输入流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())) ;BufferedReader serverIn = new BufferedReader(new InputStreamReader(s.getInputStream())) ;String line = null ;while ((line=br.readLine())!=null){if ("over".equals(line)){break ;}bw.write(line) ;bw.newLine() ;bw.flush() ;String str = serverIn.readLine() ;System.out.println("server::"+str) ;}br.close() ;s.close() ;}}

客户端同样是建立socket服务后,获取流,通过流去操作。当我们输入小写字母后,服务端就会返回大写字母,这一点UDP的接收端做不到。

3.总结

到此为止,在Java里的网络编程已经有了初步认识,UDP和TCP的理解也有了一定程度。
网络的知识远远不止于此,这里只是介绍了UDP和TCP的特点和使用方法。
有什么错误的地方还请麻烦留言说明,我会及时验证修改。
大家互相学习互相进步!!
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
0 0
原创粉丝点击