概述

网络模型

网络通讯的要素

ip地址:网络中设备的标识符

端口:用于标识同一台设备上不同的进程,有效端口:0~65535,其中0~1024是系统使用端口或者保留端口

TCP与UDP

UDP特点

面向无连接,速度快,不可靠

数据包中封装了数据、源和目的

每个数据报最大为64K

TCP特点

面向连接,通过三次握手建立连接,安全可靠

经常用于大数据的传输

Socket套接字

Socket就是为网络服务提供的一种机制

通信的两端都有Socket

网络通信其实就是Socket间的通信

数据在两个Socket间通过IO传输

UDP传输

DatagramSocket:UDP套接字

DatagramPacket:UDP数据报

下面是UDP实现的简单传输

   1: import java.net.*;

   2: import java.io.*;

   3:  

   4: /*

   5: 服务器读取键盘的数据,变成大写发送给客户端

   6: */

   7:  

   8: class UdpServerDemo

   9: {

  10:     public static void main(String[] args) throws Exception

  11:     {

  12:         //建立udp服务

  13:         DatagramSocket ds = new DatagramSocket();

  14:  

  15:         //建立键盘输入流

  16:         BufferedReader bufr = 

  17:             new BufferedReader(new InputStreamReader(System.in));

  18:  

  19:         String line = null;

  20:  

  21:         while( (line = bufr.readLine()) != null)

  22:         {

  23:             //定义数据包

  24:             byte[] data = line.toUpperCase().getBytes();

  25:             InetAddress ia = InetAddress.getLocalHost();

  26:             int port = 10000;

  27:             DatagramPacket dp = new DatagramPacket(data,data.length,ia,port);

  28:  

  29:             //发送数据包

  30:             ds.send(dp);

  31:         }

  32:         

  33:         //关闭资源

  34:         //ds.close();

  35:  

  36:     }

  37: }

  38:  

  39: class UdpClientDemo 

  40: {

  41:     public static void main(String[] args) throws Exception

  42:     {

  43:         //建立UDP服务

  44:         DatagramSocket ds = new DatagramSocket(10000);

  45:         

  46:         //定义接收数据包

  47:         byte[] data = new byte[1024];

  48:         DatagramPacket dp = new DatagramPacket(data,1024);

  49:  

  50:         while(true)

  51:         {

  52:             //接收数据包

  53:             ds.receive(dp);

  54:             

  55:             //打印相关信息

  56:             System.out.println("Address:"+dp.getAddress().getHostAddress()+"---port:"+dp.getPort());

  57:             System.out.println(new String(dp.getData(),0,dp.getLength()));

  58:         }

  59:  

  60:         //关闭资源

  61:         //ds.close();

  62:  

  63:     }

  64: }

TCP传输

ServerSocket:服务端套接字

Socket:客户端套接字

下面是用tcp实现的简单上传图片功能

   1: import java.io.*;

   2: import java.net.*;

   3:  

   4: class UploadPicClient

   5: {

   6:     public static void main(String[] args) throws Exception

   7:     {

   8:         //建立客户端TCP服务

   9:         InetAddress ia = InetAddress.getLocalHost();

  10:         Socket s = new Socket(ia,10000);

  11:         

  12:         //建立本地文件字节流

  13:         BufferedInputStream bufi = new BufferedInputStream(new FileInputStream("1.jpeg"));

  14:         

  15:         //建立tcp输出流

  16:         BufferedOutputStream bufo = new BufferedOutputStream(s.getOutputStream());

  17:         

  18:         //读取本地文件,通过tcp输出流传输到服务器

  19:         int len = -1;

  20:         byte[] data = new byte[1024];

  21:  

  22:         while( (len = bufi.read(data)) != -1 )

  23:         {

  24:             bufo.write(data,0,len);

  25:             bufo.flush();

  26:         }

  27:         

  28:         //关闭tcp输出流,相当于为服务器发送了一个结束标记 :-1

  29:         s.shutdownOutput();

  30:         

  31:         //建立tcp输入流

  32:         BufferedReader bufr = 

  33:             new BufferedReader(new InputStreamReader(s.getInputStream()));

  34:  

  35:         //打印读取到的确认信息

  36:         System.out.println(bufr.readLine());

  37:         

  38:         //关闭资源

  39:         s.close();

  40:     }

  41: }

  42:  

  43: class UploadPicServer 

  44: {

  45:     public static void main(String[] args) throws Exception

  46:     {

  47:         //建立服务器tcp服务

  48:         ServerSocket ss = new ServerSocket(10000);

  49:         

  50:         //等待客户端连接

  51:         Socket s = ss.accept();

  52:  

  53:         //打印客户机ip信息

  54:         System.out.println(s.getInetAddress().getHostName()+" connecting...");

  55:         

  56:         //建立tcp读取流

  57:         BufferedInputStream bufi = new BufferedInputStream(s.getInputStream());

  58:  

  59:         //为本地文件建立输入流

  60:         BufferedOutputStream bufo = new BufferedOutputStream(new FileOutputStream("pic.jpeg"));

  61:         

  62:         //读取网络数据,写入到本地文件

  63:         int len = -1;

  64:         byte[] data = new byte[1024];

  65:  

  66:         while( (len = bufi.read(data)) != -1)

  67:         {

  68:             bufo.write(data,0,len);

  69:             bufo.flush();

  70:         }

  71:         

  72:         //建立tcp输出流

  73:         PrintWriter pw = new PrintWriter(s.getOutputStream(),true);

  74:         

  75:         //发送服务器确认信息

  76:         pw.println("上传成功");

  77:     

  78:         //关闭资源

  79:         s.close();

  80:         ss.close();

  81:     }

  82: }

URL-URLConnection

URL:

Uniform Resource Locator,俗称网页地址

String getFile()

         获取此 URL 的文件名。

String getHost()

         获取此 URL 的主机名(如果适用)。

String getPath()

         获取此 URL 的路径部分。

int getPort()

         获取此 URL 的端口号。

String getProtocol()

         获取此 URL 的协议名称。

String getQuery()

         获取此 URL 的查询部

URLConnection    openConnection()

         返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。

URLConnection

URLConnection内部已经封装好了网络读写流,直接调用方法获取即可

InputStream    getInputStream()

         返回从此打开的连接读取的输入流。

OutputStream    getOutputStream()

         返回写入到此连接的输出流。

下面是URL实现的简单的浏览器,暂时没有调用HTML解析引擎,所以读到的数据都是带标签的html代码

   1: import java.awt.*;

   2: import java.awt.event.*;

   3: import java.io.*;

   4: import java.net.*;

   5:  

   6: class MyWindow

   7: {

   8:     private Frame f;

   9:     private TextField tf;

  10:     private TextArea ta;

  11:     private Button b;

  12:     private Dialog dErrorUrl;

  13:     private Label lErrorUrl;

  14:     private Button bErrorUrl;

  15:  

  16:     MyWindow()

  17:     {

  18:         init();

  19:     }

  20:  

  21:     //初始化窗口

  22:     private void init()

  23:     {

  24:         f = new Frame();

  25:         f.setTitle("我的浏览器");

  26:         f.setBounds(200,200,800,600);

  27:  

  28:         tf = new TextField(100);

  29:         ta = new TextArea(30,110);

  30:         b = new Button("转到");

  31:  

  32:         f.setLayout(new FlowLayout());

  33:  

  34:         f.add(tf);

  35:         f.add(b);

  36:         f.add(ta);

  37:  

  38:         dErrorUrl = new Dialog(f,"Error Url!",true);

  39:         dErrorUrl.setBounds(300,300,240,90);

  40:         dErrorUrl.setLayout(new FlowLayout());

  41:         lErrorUrl = new Label();

  42:         bErrorUrl = new Button("Ok");

  43:  

  44:         dErrorUrl.add(lErrorUrl);

  45:         dErrorUrl.add(bErrorUrl);

  46:  

  47:         action();

  48:  

  49:         f.setVisible(true);

  50:     }

  51:     

  52:     //一些简单事件响应

  53:     private void action()

  54:     {

  55:         //窗口关闭动作

  56:         f.addWindowListener(new WindowAdapter()

  57:         {

  58:             public void windowClosing(WindowEvent e)

  59:             {

  60:                 System.exit(0);

  61:             }

  62:         });

  63:         

  64:         //URL输入动作

  65:         tf.addKeyListener(new KeyAdapter()

  66:         {

  67:             public void keyPressed(KeyEvent e)

  68:             {

  69:                 if(e.getKeyCode() == KeyEvent.VK_ENTER)

  70:                     toUrl();

  71:                 

  72:                 //ta.setText(tf.getText());

  73:             }

  74:         });

  75:         

  76:         b.addActionListener(new ActionListener()

  77:         {

  78:             public void actionPerformed(ActionEvent e)

  79:             {

  80:                 toUrl();

  81:             }

  82:         });

  83:  

  84:         bErrorUrl.addActionListener(new ActionListener()

  85:         {

  86:             public void actionPerformed(ActionEvent e)

  87:             {

  88:                 dErrorUrl.setVisible(false);

  89:             }

  90:         });

  91:  

  92:         dErrorUrl.addWindowListener(new WindowAdapter()

  93:         {

  94:             public void windowClosing(WindowEvent e)

  95:             {

  96:                 dErrorUrl.setVisible(false);

  97:             }

  98:         });

  99:  

 100:     }

 101:  

 102:     //打开网站

 103:     private void toUrl()

 104:     {

 105:         URL url = null;

 106:         try

 107:         {

 108:             //获取文本框中的url

 109:             url = new URL(tf.getText());

 110:         }

 111:         catch (Exception e)

 112:         {

 113:             lErrorUrl.setText(e.toString());

 114:             dErrorUrl.setVisible(true);

 115:         }

 116:         

 117:         if(url != null)

 118:         {

 119:             ta.setText("");

 120:  

 121:             try

 122:             {

 123:                 //创建URL连接

 124:                 URLConnection conn = url.openConnection();

 125:                 //获取输入流

 126:                 BufferedInputStream bufr = new BufferedInputStream(conn.getInputStream());

 127:                 

 128:                 //读取网站服务器返回的数据

 129:                 byte[] buf = new byte[1024];

 130:                 int len = -1;

 131:  

 132:                 while( (len= bufr.read(buf)) != -1)

 133:                 {

 134:                     //打印到文本区域

 135:                     ta.append(new String(buf,0,len));

 136:                 }

 137:                 

 138:                 //打开本地浏览器

 139:                 //Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler "+url);

 140:             }

 141:             catch (IOException e)

 142:             {

 143:                 lErrorUrl.setText(e.toString());

 144:                 dErrorUrl.setVisible(true);

 145:             }

 146:             catch (Exception ex)

 147:             {

 148:                 ta.append("\r\n"+ex.toString()+"\r\n");

 149:             }

 150:  

 151:         }

 152:         

 153:     }

 154: }

 155:  

 156: class MyBrowserDemo 

 157: {

 158:     public static void main(String[] args) 

 159:     {

 160:         new MyWindow();

 161:     }

 162: }

Java笔记(二十九)……网络编程的更多相关文章

  1. Python学习日记(二十九) 网络编程

    早期的计算机通信需要有一个中间件,A要给B传东西,A必须要把信息传给中间件,B再把从中间件中拿到信息 由于不同机器之间需要通信就产生了网络 软件开发的架构 1.C/S架构 服务器-客户机,即Clien ...

  2. Java学习笔记二十九:一个Java面向对象的小练习

    一个Java面向对象的小练习 一:项目需求与解决思路: 学习了这么长时间的面向对象,我们只是对面向对象有了一个简单的认识,我们现在来做一个小练习,这个例子可以使大家更好的掌握面向对象的特性: 1.人类 ...

  3. angular学习笔记(二十九)-$q服务

    angular中的$q是用来处理异步的(主要当然是http交互啦~). $q采用的是promise式的异步编程.什么是promise异步编程呢? 异步编程最重要的核心就是回调,因为有回调函数,所以才构 ...

  4. Java笔记(十九) 反射

    反射 反射是在运行时获取类型的信息,再根据这些信息进行操作. 一.Class类 每个已加载的类在内存中都有一份类信息,每个对象都有指向它的类信息的引用. 在Java中,类信息对应的类就是java.la ...

  5. 菜鸡的Java笔记 第十九 - java 继承

    继承性的主要目的,继承的实现,继承的限制                继承是面向对象中的第二大主要特点,其核心的本质在于:可以将父类的功能一直沿用下去                为什么需要继承? ...

  6. Java笔记(二十八)……IO流下 IO包中其他常用类以及编码表问题

    PrintWriter打印流 Writer的子类,既可以接收字符流,也可以接收字节流,还可以接收文件名或者文件对象,非常方便 同时,还可以设置自动刷新以及保持原有格式写入各种文本类型的print方法 ...

  7. Java笔记(二十六)……IO流上 字节流与字符流

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  8. Java笔记(二十五)……其他常用API

    System类 工具类全部都是静态方法 常用方法 获取系统属性信息 static PropertiesgetProperties() static StringgetProperty(String k ...

  9. Java笔记(二十四)……集合工具类Collections&Arrays

    Collections 集合框架的工具类,方法全部为静态 Collections与Collection的区别 Collection是集合框架的一个顶层接口,里面定义了单列集合的共性方法 Collect ...

随机推荐

  1. 前端内容缓存技术:CSI,SSI,ESI

    一.CSI (Client Side Includes)   含义:通过iframe.javascript.ajax  等方式将另外一个页面的内容动态包含进来. 原理:整个页面依然可以静态化为html ...

  2. RasAPI函数实现PPPOE拨号

    unit uDial; interface uses Windows,Messages, SysUtils, Ras;// Classes; var //EntryName,UserName,Pass ...

  3. Stop a hung service 关闭一个无响应的windows 服务

    If you ever have trouble with a service being stuck in a 'starting' or 'stopping' state, you can run ...

  4. We7——很有意思的一个开源CMS

    目前做门户.做网站,基本上都需要用到一个系统,那就是CMS内容管理系统:现在开源产品有很多,笔者也是从事这个行业的,国内的各大CMS提供商基本上都试用过,今天向大家推荐一款很有意思的产品——We7CM ...

  5. 软件测试 -- alpha测试和beta测试的区别

    alpha测试是在用户组织模拟软件系统的运行环境下的一种验收测试,由用户或第三方测试公司进行的测试,模拟各类用户行为对即将面市的软件产品进行测试,试图发现并修改错误. Beta测试是用户公司组织各方面 ...

  6. 多个div并排显示的居中问题——来自腾讯的一道面试题

    前两天曲面了一下腾讯,被鄙视了... 自己太水了,且面试官对我可能也有点不爽,说什么还没叫我我就去了,可是尼玛写的面试时间是3点40,我特码进去的时候都3点50了,我还以为晚了呢,他妈的. 实现几个d ...

  7. 利用百度地图API,在浏览器中找到自己的位置

    首先你得有个百度地图的秘钥,http://lbsyun.baidu.com/apiconsole/key 剩下的就是编码了 这里面会用到一个javascript里的一个函数,getMyLocation ...

  8. JavaScript函数调用

    1. 调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数. 2. 除了声明时定义的形参,每个函数都有两个附加的参数:this和arguments. 1. this在面向对象编程中很重要,它的值 ...

  9. WordPress数据库中的表、字段、类型及说明

    wp_categories: 用于保存分类相关信息的表.包括了5个字段,分别是: cat_ID – 每个分类唯一的ID号,为一个bigint(20)值,且带有附加属性auto_increment. c ...

  10. oracle删除表的方法

    1. 删除oracle表中的所有数据而不删除表: 语法: TRUNCATE TABLE table_name; 使用这条语句只是删除表中的全部数据,不是删除表,这种方式也叫做截断表,这种方式比使用de ...