outBuffer = currDate.toString().getBytes();
reply = new DatagramPacket(outBuffer, outBuffer.length, clientAddress, clientPort); timeSocket.send(reply); } }finally{
timeSocket.close(); }
}catch(IOException ex){ System.out.println(ex);
}catch(NumberFormatException e){
System.out.println(\ }
System.exit(0); }
}
(1)客户端程序:UDPDaytimeClient
import java.net.*; import java.io.*;
public class UDPDaytimeClient {
public static void main(String[] args) { String host;
InetAddress hostAddress; byte[] outBuffer=new byte[1]; byte[] inBuffer=new byte[512]; DatagramPacket request; DatagramPacket reply; DatagramSocket timeSocket; if(args.length<2){
System.out.println(\serverPort\
System.out.println(\ }else{ try{
host=args[0];
hostAddress=InetAddress.getByName(host);
System.out.println(\正在取得\的日期...\ timeSocket=new DatagramSocket(); // 创建请求和应答缓冲区
request = new DatagramPacket(outBuffer, outBuffer.length, hostAddress, Integer.parseInt(args[1])); reply = new DatagramPacket(inBuffer, inBuffer.length); // 发送请求并读取应答 try{
java
UDPDaytimeClient
serverName
timeSocket.setSoTimeout(5*1000); timeSocket.send(request); timeSocket.receive(reply); System.out.print(\时间服务器应答:\
new String(inBuffer, 0, reply.getLength())); }finally{
timeSocket.close(); }
}catch(IOException ex){ System.out.println(ex);
}catch(NumberFormatException e){
System.out.println(\ } }
System.exit(0); }
}
运行结果: 服务器:
客户端:
五、实验结果及分析
单纯的做上面的实验并不能真正学到多少,因为通常java都是做服务端的,跟其他不同平台进行数据通信,于是我为了加深对Socket的了解,我特意为iPhone写了个客户端,服务端依然用java,测试它们之间数据的传送。 运行结果如下: Iphone端:
连接后接收到来自java服务端的字符串。
点击计算,发送边长给服务器,并获取计算结果。
服务端:
在编写iPhone端的Socket客户端期间遇到了很大问题。 Java服务端识别不了iPhone端发送的字符串。于是各种谷歌搜索,发现问题如下,原来java的readUTF读取的字符跟objective-c 的并不完全相同。
但是没有问题是解决不了的,最后还是解决了这个奇怪的问题。