第九讲 网络编程

第九讲 网络编程

     网络编程的基础知识

     网络协议与 TCP/IP

     IP 地址和 Port (端口号)

▼本地回路的 IP 地址: 127.0.0.1

▼端口号的范围为 0 65535 之间, 0 1023 之间的端口数是用于一些知名的网络服务和应用。

     UDP 网络程序

UDP ,用户数据报协议( User Datagram Protocol ),是无连接通信协议。

     TCP 网络程序

     TCP ,传输控制协议( Transmission Control Protocol , 是面向连接的通信协议。

TCP UDP 的数据帧格式简单图例:

协议类型

IP

目标 IP

源端口

目标端口

帧序号

帧数据

                                                        其中协议类型用于区分 TCP UDP

Socket

     Socket 是网络驱动层提供给应用程序编程的接口和一种机制。

     可以把 Socket 比喻成是一个港口码头,应用程序只要把货物放到港口码头上,就算完成了货物的运送。应用程序只需等待货物到达码头后,将货物取走。

     Socket 是应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的 IP Port

     Socket 数据发送过程

     Socket 数据接收过程

Java 中的网络编程类

     位于 java.net 包中

     DatagramSocket 类用于 UDP 通信

     ServerSocket 类用于 TCP 通信的服务器端(接受客户端连接的)

     Socket 类用于 TCP 通信的服务器(专用于和客户端进行数据传输的)和客户端

UDP 网络程序

     DatagramSocket

此类表示用来发送和接收数据报包的套接字。

数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。

示例: DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888)); 这等价于: DatagramSocket s = new DatagramSocket(8888); 两个例子都能创建能够在 UDP 8888 端口上接收广播的 DatagramSocket

     构造函数

DatagramSocket ()
          
构造数据报套接字并将其绑定到本地主机上任何可用的端口。

DatagramSocket (int   port)
          
创建数据报套接字并将其绑定到本地主机上的指定端口

DatagramSocket (int   port, InetAddress   laddr)
          
创建数据报套接字,将其绑定到指定的本地地址。

     close ()
          
关闭此数据报套接字。

     send (DatagramPacket   p)
          
从此套接字发送数据报包。

     receive (DatagramPacket   p)
          
从此套接字接收数据报包。

     DatagramPacket

如果把 DatagramSocket 比作创建的港口码头,那么 DatagramPacket 就是发送和接收数据的集装箱。

     构造函数:

DatagramPacket (byte[]   buf, int   length)
          
构造 DatagramPacket ,用来接收长度为 length 的数据包

DatagramPacket (byte[]   buf, int   length, InetAddress   address, int   port)
          
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

     getAddress ()
          
返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。

     getPort ()
          
返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

     getData ()
          
返回数据缓冲区。

     getLength ()
          
返回将要发送或接收到的数据的长度。

     InetAddress

     InetAddress 是用于表示计算机 IP 地址的一个类,而在日常应用中的计算机地址是用“ 192.168.0.1 ”、 www.it315.org 等字符串格式来表示的。

     getByName (String   host)
          
在给定主机名的情况下确定主机的 IP 地址。

     getHostAddress ()
          
返回 IP 地址字符串(以文本表现形式)。

     getHostName ()
          
获取此 IP 地址的主机名。

     getLocalHost ()
          
返回本地主机。

     最简单的 UDP 程序

     字符串与字节数组之间的双向转换

     UDP 接收程序必须先启动运行,才能接收 UDP 发送程序发送的数据。

     start 命令来打开新命令行窗口的好处。

     解决发送中文字符串的问题。

     UDP 编写网络聊天程序
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import java.net.*;
public class UdpSend
{
 
 /**
  * Method main
  *
  *
  * @param args
  *
  */
 public static void main(String[] args)
 {
  // TODO: Add your code here
  try
  {
   DatagramSocket ds=new DatagramSocket();
   /*
   String strInfo="hello www.it315.org";
   ds.send(new DatagramPacket(strInfo.getBytes(),strInfo.length(),InetAddress.getByName("192.168.0.239"),2000));
   */
   String str="hello 中国";
   ds.send(new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("192.168.0.239"),2500));
   ds.close();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  
 } 
}
import java.net.*;
public class UdpReceive
{
 
 /**
  * Method main
  *
  *
  * @param args
  *
  */
 public static void main(String[] args)
 {
  // TODO: Add your code here
  try
  {
   DatagramSocket ds=new DatagramSocket(2500);
   byte []buf=new byte [1024];
   DatagramPacket dp=new DatagramPacket(buf,1024);
   ds.receive(dp);
   System.out.println(new String(dp.getData(),0,dp.getLength())+
    " from:"+" IP: "+dp.getAddress().getHostAddress()+" Port: "+dp.getPort());
   ds.close();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  
  
 } 
}


       

posted on 2007-01-27 18:32 大头剑客 阅读(225) 评论(0)  编辑  收藏 所属分类: 学习笔记


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

公告

写字楼里写字间,写字间里程序员;
程序人员写程序,又拿程序换酒钱;
酒醒只在网上坐,酒醉还来网下眠;
酒醉酒醒日复日,网上网下年复年;
但愿老死电脑间,不愿鞠躬老板前;
奔驰宝马贵者趣,公交自行程序员;
别人笑我忒疯癫,我笑自己命太贱;
不见满街漂亮妹,哪个归得程序员.
不管前面是地雷阵还是万丈深渊,
我都将勇往直前,义无反顾,
鞠躬尽瘁,死而后已。
—— 朱镕基总理

常用链接

留言簿(1)

随笔档案

文章分类

文章档案

学习园地

最新随笔

搜索

积分与排名

最新评论