重复和并发服务器
所有的这些调用都可以掷出一个unknownhostexception违例.如果一台计算机没有连接上dns服务器,或者主机的确没有找到,这个违例就会被掷出.如果一台计算机没有一个激活的tcp/ip配置,getlocalhost()也为失败并掷出一个违例.
一旦一个地址被确定了,数据报就可以被送出了.下面的程序传输了一个字符串给目的socket:
string tosend = "this is the data to send!");
byte[] sendbuf = new byte[ tosend.length() ];
tosend.getbytes( 0, tosend.length(), sendbuf, 0 );
datagrampacket sendpacket = new datagrampacket( sendbuf, sendbuf.length,
addr, port);
clientsocket.send( sendpacket );
首先,字符串必须被转换成一个字节数组.然后,一个新的datagrampacket实例必须被建立.注意构建器的最后两个参数.因为要发送一个包,所以地址和端口必须被给定.一个applet可能可以知道它的服务器的地址,但是服务器如何知道它的客户机的地址呢.当任何一个包被收到后,返回的地址和端口会被解压出来,并通过getaddress()和getport()方法得到.这就是一个服务器如何回应一个客户端的包:
datagrampacket sendpacket = new datagrampacket( sendbuf, sendbuf.length,
recvpacket.getaddress(), recvpacket.getport() );
serversocket.send( sendpacket );
不像面向连接的操作,数据报服务器服务器其实比数据报客户端更简单:
数据报服务器
一个数据报服务器的基本步骤:
1.在一个指定的端口上建立一个数据报socket.
2.用receive方法等待进来的包.
3.用特定的协议来回应收到的包.
4.回到第二步或继续第二步.
5.关闭数据报socket.
列表9.3演示了一人简单的数据报回应服务器.它将回应它收到的包.
列表9.3.一个简单的数据报回应服务器
import java.io.*;
import java.net.*;
public class simpledatagramserver
{
public static void main(string[] args)
{
datagramsocket socket = null;
datagrampacket recvpacket, sendpacket;
try
{
socket = new datagramsocket(4545);
while (socket != null)
{
recvpacket= new datagrampacket(new byte[512], 512);
socket.receive(recvpacket);
sendpacket = new datagrampacket(
recvpacket.getdata(), recvpacket.getlength(),
recvpacket.getaddress(), recvpacket.getport() );
socket.send( sendpacket );
}
}
catch (socketexception se)
{
system.out.println("error in simpledatagramserver: " + se);
}
catch (ioexception ioe)
{
system.out.println("error in simpledatagramserver: " + ioe);
闽公网安备 35060202000074号