重復和並發服務器
所有的這些調用都可以擲出一個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);