JAVA网络编程基础(一)

首先是一些基础知识:

 1.IP地址和Port(端口号)

本机的IP地址:172.0.0.1

端口号的范围为0~65535之间(2个字节),0~1023是用于知名网络服务和应用,所以最好不要用0~1023这些端口号

 2.TCP和UDP

TCP:传输控制协议(Transmission Control Protocol)面向连接的通信协议

UDP:用户数据报协议(User Datagram Protocol)无连接的通信协议

 3.Socket

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

可以把Socket比作是一个码头,应用程序将货物运送到码头,就完成了货物的运送。在另一边,应用程序只需等货物到达码头后将货物取走就可以了。

Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,并告知对应的IP和端口

 4.Java中的网络编程类

位于java.net包中

DatagramSocket类用于UDP通信

ServerSocket类用于TCP通信的服务器端

Socket类用于TCP通信的服务器和客户端

 

现在看下如何编写UDP网络程序 

DatagramSocket类

构造方法

----public DatagramSocket()   (用于先发送的时候不用指定端口号,会自动选择一个没有用过的端口号)

----public DatagramSocket(int port)  (如果要接受数据,那就必须指定一个明确的端口号)

----public DatagramSocket(int port,InetAddress laddr)  (如果一个计算机上有多个IP地址的话,那就还需指定一个明确的IP地址……)

 

----close方法(释放掉DatagramSocket的资源之后,端口号可以重新被其他网络资源所使用)

 

----send(DatagramPacket p)方法(用于发送UDP数据包)

----receive(DatagramPacket p)方法(用于接受UDP数据包)

DatagramPacket类

如果把DatagramSocket比作是码头,那么DatagramPacket可以看作是发送和接受数据的集装箱

构造方法

----public DatagramPacket(byte[] buff,int length)   (buff代表缓冲区,length代表缓冲区的大小,在接受数据时使用,不用指定IP地址和端口)

----public DatagramPacket(byte[] buff,int length,InetAddress address,int port) (address和port代表目标计算机的IP地址和端口,在发送数据时使用)

 

----getAddress,getPort,getData,getLength方法

InetAddress类

InetAddress是一个用于表示计算机IP地址的一个类

----getByName()  静态方法,返回实例

----getHostAddress() 返回IP地址字符串,形如“192.168.0.1”

 

最简单的UDP程序

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

UDP接受程序必须先启动才能接受到UDP发送程序所发送的内容

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

 

发送程序:

 1 import java.net.DatagramPacket;
2 import java.net.DatagramSocket;
3 import java.net.InetAddress;
4
5 public class UdpSend {
6 public static void main(String[] args) throws Exception {
7 DatagramSocket ds=new DatagramSocket();
8 String info="Hello World!";
9 ds.send(new DatagramPacket(info.getBytes(),info.length(),InetAddress.getByName("115.173.172.98"),3000));
10 ds.close();
11 }
12 }

接收程序:

 1 import java.net.DatagramPacket;
2 import java.net.DatagramSocket;
3
4 public class UdpRecv {
5 public static void main(String[] args) throws Exception {
6 DatagramSocket ds=new DatagramSocket(3000);
7 DatagramPacket dp=new DatagramPacket(new byte[1024],1024);
8 ds.receive(dp);
9 System.out.println(new String(dp.getData(),0,dp.getLength()));
10 System.out.println("from:"+dp.getAddress().getHostAddress()+":"+dp.getPort());
11 ds.close();
12 }
13 }

 

以上程序只能用来传送英文字符,如果要传送中文的话,需把发送程序中的info.length()改成info.getBytes().length,因为中文占两个字节。



posted @ 2011-11-26 18:57  一直在等  阅读(710)  评论(0编辑  收藏  举报