----------------------
ASP.Net+Unity开发、
.Net培训、期待与您交流! ----------------------
java网络编程学习总结:1.在ISO网络参考模型中,我们java编程主要在传输层和应用层上操作;
2.在传输层上我们要用到两个传输协议: TCP协议和 UDP协议。
3.TCP协议的特点:TCP协议是 面向连接的,可以 传输大数据量的, 可靠的传输,TCP保证可靠传输是通过 三次握手和 数据重发。
4.UDP协议的特点:UDP是 面向无连接的, 不可靠的数据传输协议,它采用数据报的形式发送数据,其发送数据前不必握手,其 传输效率高于TCP协议
5.java中封装了网络操作相关的类库,这个类库是 java.net类库
6.在java.net类库中我们常用的类有: InetAddress, DatagramPacket, DatagramSocket, Socket, ServerSocket, URL, URLConnection.7.除了URL类和URLConnection类外,其它类都工作在 传输层,这两个类工作在应用层,它对底层的一些操作进行了封装,所以操作相比传输层上的那些类更简单些,
URL类和URLConnection类使用TCP协议 ,因此他们是 可靠的传输。8.在网络上进行通信的 计算机都有一个IP地址,IP地址标识了 计算机在网络上的位置,是计算机在 网络上的身份证,通过IP地址,世界上任意两台计算机就可以进行相互通信了,Java中 InetAddress类对IP地址相关的操作进行了封装,我们可以把InetAddress类的实例对象看作计算机在网络上地址。9.DatagramPacket类和DatagramSocket类共同完成了UDP通讯,DatagrammPacket类封装了两台计算机 通信的数据实体,即要通讯的内容,DatagramSocket类 通过InetAddress类的实例对象将要通讯的数据实体发送到目的地。10.Socket类可以进行TCP通讯,他是 基于流进行数据传输的,被传输的 数据大小没有限制,在传输前,会和要通讯的计算机 握手三次,以保证连接的正常建立,传输过程中 设定计时器,当某个ip数据包到达计时器设定的阀值时仍 未收到远程计算机发来的响应即认为这个ip数据包丢失,然后 重新发送这个ip数据包,这样保证了数据在传输过程中 不会出现丢包现象。以下是网络编程的简单示例:
简单的UDP聊天程序,这个客户端只能发送不能接收:
/** * 本示例演示UDP通讯的基本步骤:首先建立服务端,并监听一个端口 * 接着建立客户端,通过服务端监听的端口和服务端进行通讯。建立服务 * 端和客户端都用到了DatagramSocket类,DatagramSocket类本身既可以 * 当服务端又可以当客户端,当被当作客户端时,用到了他的send函数来 * 发送消息,当被当作服务端时,用到了他的receive函数接受消息。无论是 * 发送还是接受消息,消息体都用Datagrampacket进行了封装。 * */ class UDPClient implements Runnable {// 客户端程序 public void run() { try { DatagramSocket ds = new DatagramSocket(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("客户端--请输入聊天内容:"); byte[] sendbuff = br.readLine().getBytes(); ds.send(new DatagramPacket(sendbuff, sendbuff.length, InetAddress.getLocalHost(), 4073));//发送消息给服务端 if("end".equals(new String(sendbuff)){ System.out.println("客户端即将退出。。。。") return; } } } catch (Exception e) { System.out.println("连接服务端失败,开启或重启服务端!"); e.printStackTrace(); } } } class UDPServer implements Runnable {// 服务端程序 public void run() { try { DatagramSocket ss = new DatagramSocket(4073); while (true) { byte[] recbuff = new byte[1024]; ss.receive(new DatagramPacket(recbuff, 1024));//从客户端接受消息 if ("end".equals(new String(recbuff).trim())) { System.out.println("服务端即将关闭。。。。"); ss.close(); return; } System.out.println("服务器端--客户端输入的内容为:" + new String(recbuff)); } } catch (Exception e) { System.out.println("服务端开启失败,请查看端口确保服务端端口未被占用"); e.printStackTrace(); } } }
简单的TCP聊天程序:/** * 本例演示了TCP协议通讯的基本步骤:首先创建服务端, * 接着创建客户端,通过服务端绑定的端口和服务端进行通讯。 * 创建服务端用到了ServerSocket,它监听构造它时给他的端口号 * 当有客户端尝试连接这个端口时,ServerSocket的accpet函数就会 * 返回客户端连接的套接字,通过客户端连接的套接字就可以和客户 * 端进行通信,当没有客户端尝试连接时,accpet函数会一直阻塞, * 因此当有多个客户端尝试连接服务端时,不能在一个线程中进行 * 与客户端的通讯,对每个客户端的通讯都要开启一个独立的线程 * ,否则会因为accpet函数的阻塞导致与客户端通讯的阻塞。 * */ class TCPClient extends Thread {// TCP客户端程序 private void TCPClientStart() throws Exception { Socket cs = new Socket(InetAddress.getLocalHost(), 3790);//建立客户端socket BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( cs.getOutputStream()));//发送消息的通道 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//输入消息的通道 String msg=null; while (true) { System.out.println("客户端---请输入消息内容:"); msg=br.readLine(); bw.write(msg + "\n");//将从键盘接收的消息通过发送通道发送给服务端 bw.flush(); if("end".equals(msg.trim())){ return;//输入end时结束客户端 } } } public void run() { try { TCPClientStart(); } catch (Exception e) { System.out.println("连接服务器失败,请重试。。。。"); e.printStackTrace(); } } } class TCPServer extends Thread {// TCP服务端程序 private void TCPServerStart() throws Exception { ServerSocket ss = new ServerSocket(3790);// 绑定3790端口 Socket cs = ss.accept();//从被监听端口获取客户端连接套接字 System.out.println("服务端已启动,正在等待客户端发送消息"); BufferedReader br = new BufferedReader(new InputStreamReader( cs.getInputStream()));//从客户端接收消息的通道 String msg=null; while (true) { msg=br.readLine(); if("end".equals(msg.trim())){ return;//接收到end时结束服务端 } System.out.println("服务端---接收到消息:" + msg); } } public void run() { try { TCPServerStart(); } catch (Exception e) { System.out.println("服务端开启失败,请重试") e.printStackTrace(); } } }
简单的TCP文件传输示例:
/** * 本例演示了文件上传,文件上传的原理和聊天程序是 * 一样的,都是通过读取套接字流中的数据来实现的。 */ class FileClient extends Thread {// 文件上传客户端 private void fileUpload() throws Exception { Socket cs = new Socket(InetAddress.getLocalHost(), 3600);//创建客户端socket FileInputStream fis = new FileInputStream("C:\\test.jpg"); BufferedOutputStream bos = new BufferedOutputStream( cs.getOutputStream());//打开文件上传通道 byte[] sendbuff = new byte[1024];// 1K缓冲区 int len=0; while ((len=fis.read(sendbuff))!= -1) { bos.write(sendbuff,0,len);//上传文件 } fis.close(); cs.close(); } public void run() { try { fileUpload(); } catch (Exception e) { System.out.println("开启客户端失败,请重试。。。。"); e.printStackTrace(); } } } class FileServer extends Thread {// 文件上传服务端 private void fileServer() throws Exception { ServerSocket ss = new ServerSocket(3600);//服务端Socket Socket cs = ss.accept(); BufferedInputStream bis = new BufferedInputStream(cs.getInputStream());//文件接收通道 FileOutputStream fos = new FileOutputStream("E:\\test.jpg"); byte[] recbuff = new byte[1024];// 1K缓冲区 int len=0; while ((len=bis.read(recbuff)) != -1) { fos.write(recbuff,0,len); } fos.close(); ss.close(); } public void run() { try { fileServer(); } catch (Exception e) { System.out.println("服务端开启失败,请重试。。。。"); e.printStackTrace(); } } }
URL类和URLConnection类的应用示例/** * URLConnection和URL类功能强大,其中封装了很多 * 和网络操作相关的方法,包括浏览器协议相关的操作 * ,很强大,本例只做演示,仅用到了基本的流操作, * 通过URL类的openConnection方法获取和远程资源的连接 * 再通过URLConnection的openInputstream方法得到和读取 * 远程资源的流,再从流中读取想要读取的数据。 */ class URLConn extends Thread { public void run() { try { URLConnDemoStart(); } catch (Exception e) { e.printStackTrace(); } } private void URLConnDemoStart() throws Exception { URL url = new URL("http://www.baidu.com");//用给定的网址创建URL BufferedReader bis = new BufferedReader(new InputStreamReader( url.openConnection().openInputStream());//通过URL打开读取流 String context=null; while((context=bis.readLine)!=null) System.out.println(context);//打印从流中获取的内容 } }
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:www.itheima.com