湖南大学 计算机网络实验报告二
1 / 22
《计算机网络》
实验报告
信息安全 2015年4月1日
湖南大学 计算机网络实验报告二
实验二 网络基础编程实验
一、实验目的
通过本实验,学习采用Socket(套接字)设计简单的网络数据收发程序,理解应用数据包是如何通过传输层进行传送的。 二、实验内容
2.1、编写TCP进行数据发送的简单程序(java)
TCPClient.javTaCPServer.java
2.2、编写UDP进行数据发送的简单程序(java)
UDPServer.javaUDPClient.java
2.3多线程\\线程池对比
TCPEchoClient.java
TCPEchoServerThread.javaTCPEchoServerPool.javaTCPEchoServer.java
2.4写一个简单的chat程序,编程语言不限。 三、实验程序
(1)TCP客户端TcpClient.java import java.io.*; import java.net.*;
public class TcpClient{
public static void main(String argv[]) throws Exception { String sentence;//定义客户消息
String modifiedSentence;//定义服务器消息
InetAddress address = InetAddress.getLocalHost();//获取本机端口
BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); //创建客户输入流
//创建一个Scoket实例:构造函数向指定的远程主机和端口建立一个TCP连接。address.getHostName()为本机IP地址;6789为TCP服务器端口
Socket clientSocket = new Socket(address.getHostName(),6789); //客户套接字 //通过套接字的输入输出流(I/O streams)进行通信
DataOutputStream outToServer = new DataOutputStream( clientSocket.getOutputStream()); //创建客户端到服务器的输出流
BufferedReader inFromServer = new BufferedReader( new InputStreamReader(clientSocket.getInputStream())); //创建服务端输入流
2 / 22
湖南大学 计算机网络实验报告二
sentence = inFromUser.readLine();//客户端读取客户输入消息
outToServer.writeBytes(sentence+'\\n'); //客户端发送消息到服务器端
modifiedSentence =inFromServer.readLine();//客户端接收来自服务器的消息 System.out.println(\/客户端显示服务器发送过来的消息
clientSocket.close(); //客户端关闭套接字 } }
(2)TCP服务器端TcpServer.java import java.io.*; import java.net.*;
public class TcpServer {
public static void main(String argV[]) throws Exception { String clientSentence;//定义接收的消息
String capitalizedSentence;//定义发送的消息
ServerSocket welcomeSocket= new ServerSocket(6789);
//创建一个ServerSocket实例,并指定本地端口,侦听该指定端口收到的连接 while(true){
Socket connectionSocket = welcomeSocket.accept();
//调用ServerSocket的accept()方法以获取下一个客户端连接,基于新建立的客户端连接,创建一个Socket实例,并由accept()方法返回。
BufferedReader inFromClient = new BufferedReader( new InputStreamReader(connectionSocket.getInputStream()));//创建客户端输入流
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());//创建服务器输出流
//使用所返回的Socket实例的InputStream和OutputStream与客户端进行通信。 clientSentence = inFromClient.readLine(); //接收客户发送的信息
capitalizedSentence = clientSentence.toUpperCase()+'\\n'; //转换接收到的信息,小写变大写
outToClient.writeBytes(\输出给客户端 } } }
(3)UDP通信服务器端 UDPServer.java import java.io.*; import java.net.*;
public class UDPServer {
public static void main(String argV[]) throws Exception {
DatagramSocket serverSocket = new DatagramSocket (9876); //构造数据包套接字并将其绑定到主机上的端口9876
byte[] receiveData = new byte[1024]; //服务器从客户端接收到的信息 byte[] sendData = new byte[1024]; //服务器发送给客户端的信息 while(true){
3 / 22
湖南大学 计算机网络实验报告二
DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length); //创建从客户端数据包
serverSocket.receive(receivePacket); //服务器从客户端接收数据包
String sentence = new String(receivePacket.getData()); //服务器接打开数据包得到消息
InetAddress IPAddress = receivePacket.getAddress();//获取客户端的IP地址
int port = receivePacket.getPort();//获取客户端端口
String capitalizedSentence = sentence.toUpperCase();//将接收的信息转为大写
sendData = capitalizedSentence.getBytes(); //转换后的消息 //服务器发送给客户端的数据包,将转换后的消息打包
DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,IPAddress,port);
serverSocket.send(sendPacket);//服务器发送数据包给客户端 } } }
(4)UDP通信客户端 UDPClient.java import java.io.*; import java.net.*;
public class UDPClient{
public static void main(String argv[]) throws Exception { byte[] receiveData = new byte[1024]; //客户端接收的消息 byte[] sendData = new byte[1024]; //客户端发送的消息
BufferedReader inFromReader = new BufferedReader( new InputStreamReader(System.in));//客户输入流
DatagramSocket clientSocket = new DatagramSocket (); //客户端数据包套接字 InetAddress IPAddress = InetAddress.getLocalHost(); //获取本机IP地址 String sentence = inFromReader.readLine(); //客户端读取用户所输入的消息 sendData = sentence.getBytes(); //复制到要发送的消息
//客户端发送的数据包,这里将客户端要发送的消息,客户端的IP地址,端口打包 DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,IPAddress,9876);
clientSocket.send(sendPacket);//客户端套接字发送数据包
//客户端接收的数据包,数据包包含从服务器接收的消息,消息长度
DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);
clientSocket.receive(receivePacket); //客户端接收数据包
String modifiedSentence = new String(receivePacket.getData()); //将接收的数据包解开
System.out.println(\\客户端显示数据包里的消息 clientSocket.close(); //关闭套接字
4 / 22
湖南大学 计算机网络实验报告二
}}
(5)通过TCP协议与回馈服务器(echo server)进行通信的客户端TCPEchoClient.java import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;
import java.net.SocketAddress; public class TCPEchoServer{
private static final int BUFSIZE = 32;
public static void main(String[] args) throws IOException{ if (args.length != 1)//获取启动服务的端口
throw new IllegalArgumentException(\ int servPort = Integer.parseInt(args[0]); //分配一个端口用于启动server端
ServerSocket servSock = new ServerSocket(servPort); int recvMsgSize;
byte[] receiveBuf = new byte[BUFSIZE]; while (true){
Socket clntSock = servSock.accept(); //接收客户端的主动连接
SocketAddress clientAddress = clntSock.getRemoteSocketAddress(); System.out.println(\ InputStream in = clntSock.getInputStream(); OutputStream out = clntSock.getOutputStream(); while ((recvMsgSize = in.read(receiveBuf)) != -1) out.write(receiveBuf, 0, recvMsgSize); clntSock.close(); }}}
(6)为前面的客户端程序实现回馈服务器TCPEchoServer.java import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;
import java.net.SocketException; public class TCPEchoClient{
public static void main(String[] args) throws IOException{
if ((args.length < 2) || (args.length > 3)) // 传入的数据在2~3之间,0:地址 1:传输字符 <2:端口>
throw new IllegalArgumentException(\rt>]\
String server = args[0]; // ip地址或主机名称 byte[] data = args[1].getBytes();
int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;//默认端口为7
5 / 22