
课程名称 计算机网络实验
实验项目名称 实验六 传输层网络编程
学生姓名 专业班级 学号
实验成绩 指导老师(签名 ) 日期
一. 实验目的和要求
1.通过实现使用Java Socket进行通信的UDP客户端和服务器来获得关于使用Java Socket网络编程的经验;
2.通过实现使用Java Socket进行通信的TCP客户端和服务器来获得关于使用Java Socket网络编程的经验。
二. 实验内容、原理及实验结果与分析
1.UDP编程(参考电子讲义“网络编程参考资料-传输层.pdf”及教材“第2章 Socket编程”)
1.1阅读 “网络编程参考资料-传输层.pdf”中 11.2部分,输入11.2.4部分“最简单的UDP程序”的源代码(UdpSend.java和UdpRecv.java)并在机器上编译运行通过(注意:要根据自己的机器IP地址修改源代码)。
【程序源代码】
发送:
import java.net.*;
public class Hf {
public static void main(String []args)throws Exception
{
DatagramSocket ds=new DatagramSocket();
String str="Hello world";
DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("10.66.21.139"),3000);
ds.send(dp);
ds.close();
}
}
接收:
import java.net.*;
public class Hf1 {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO 自动生成方法存根
DatagramSocket ds=new DatagramSocket(3000);
byte [] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,1024);
ds.receive(dp);
String strRecv=new String (dp.getData(),0,dp.getLength())+"from"+
dp.getAddress().getHostAddress()+":"+dp.getPort();
System.out.print(strRecv);
ds.close();
}
}
【实验结果与分析】
2.TCP编程(参考电子讲义“网络编程参考资料-传输层.pdf”及教材“第2章 Socket编程”)
2.1阅读 “网络编程参考资料-传输层.pdf”中 11.3 部分,输入11.3.3部分“简单的TCP服务器程序”的源代码(TcpServer.java)并在机器上编译运行,然后通过在命令行中输入“telnet 自己的IP地址 8001”进行测试。
【程序源代码】
import java.net.*;
import java.io.*;
public class h1 {
public static void main(String[] args) {
// TODO 自动生成方法存根
try
{
ServerSocket ss=new ServerSocket(8001);
Socket s=ss.accept();
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
ops.write("welcome to www. 洪锋..com".getBytes());
byte [] buf=new byte[1024];
int len = ips.read(buf);
System.out .println(new String(buf,0,len));
ips.close();
ops.close();
s.close();
ss.close();}
catch(Exception e){e.printStackTrace();}
}
}
【实验结果与分析】
2.2阅读 “网络编程参考资料-传输层.pdf”中 11.3 部分,输入11.3.4 部分“TCP服务器程序”(Tcp_Server.java)以及11.3.5客户端程序的源代码(Tcp_Client.java)并在机器上编译运行,客户端测试命令为“java Tcp_Client 自己的IP地址 8001”。
【程序源代码】
TCP:
import java.net.*;
import java.io.*;
class Servicer implements h2{
Socket s;
public Servicer(Socket s){
this.s = s;
}
public void run(){
try{
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos = new DataOutputStream(ops);
while(true){
String strWord = br.readLine();
//System.out.println(strWord + ":" + strWord.length());
if(strWord.equalsIgnoreCase("quit"))
break;
String strEcho = (new StringBuffer(strWord).reverse()).toString();
//dos.writeBytes(strWord + "---->" + strEcho + "\\r\\n");
dos.writeBytes(strWord + "---->" + strEcho + System.getProperty("line.separator"));
}
br.close();
dos.close();
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
Public class h1{
public static void main(String [] args)
{
try
{
ServerSocket ss=new ServerSocket(8001);
while(true)
{
Socket s=ss.accept();
new Thread(new Servicer(s)).start();
}
//ss.close();
}catch(Exception e){e.printStackTrace();}
}
}
客户端:
import java.net.*;
import java.io.*;
public class h3
{
public static void main(String[] args)
{
try
{
//Socket s=new Socket(InetAddress.getByName("10.66.21.138"),8001);
if(args.length<2)
{
System.out.println("Usage:java TcpClient ServerIP ServerPort");
return;
}
Socket s=new Socket(InetAddress.getByName(args[0]),Integer.parseInt(args[1]));
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
DataOutputStream dos = new DataOutputStream(ops);
BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));
while(true)
{
String strWord = brKey.readLine();
dos.writeBytes(strWord + System.getProperty("line.separator"));
if(strWord.equalsIgnoreCase("quit"))
break;
else
System.out.println(brNet.readLine());
}
dos.close();
brNet.close();
brKey.close();
s.close();
}catch(Exception e){e.printStackTrace();}
}
}
【实验结果与分析】
3.Ethereal抓包分析
用Ethereal软件截获上面三个程序运行时客户机和服务器之间发送的数据包,并且根据截获的数据包内容进行分析。
【实验结果与分析】
三. 讨论、心得
记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。
