第九讲
网络编程
●
网络编程的基础知识
◆
网络协议与
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();
}
}
}