1、实验二网络基础编程实验计算机网络实验报告信息安全2015年 4 月 1日实验二网络基础编程实验一、 实验目的通过本实验,学习采用 Socket (套接字)设计简单的网络数据收发程序,理解应用数据 包是如何通过传输层进行传送的。二、 实验内容2.1、编写TCP进行数据发送的简单程序(java)TCPCIient. j a vTaC PServer .javaUDPServer.java UDPCIient.java2.3多线程线程池对比TCPEchoCIient.java2.4写一个简单的chat程序,编程语言不限。三、实验程序(1)TCP客户端 TcpCIient.java |import j
2、ava.io.*;import java .n et.*;public class TcpClie ntpublic static void main( Stri ng argv) throws Exceptio n Stri ng senten ce; 定义客户消息Stri ng modifiedSe nte nce; 定义服务器消息In etAddress address = In etAddress.getLocalHost(); 获取本机端口BufferedReader inFro mUser = new BufferedReader( new In putStreamReader(S
3、ystem.i n); / 创建客户输入流/创建一个Scoket实例:构造函数向指定的远程主机和端口建立一个 TCP连接。address.getHostName() 为本机IP地址;6789为TCP服务器端口Socket clie ntSocket = new Socket(address.getHostName(),6789); / 客户套接字/通过套接字的输入输出流(I/O streams) 进行通信DataOutputStream outToServer = new DataOutputStream( clie ntSocket.getOutputStream(); II 创建客户端到服
4、务器的输出流BufferedReader inF romServer = new BufferedReader( new In putStreamReader(clien tSocket.getI nputStream(); II 创建服务端输入流se ntence = inF romUser.readLi ne(); 客户端读取客户输入消息outToServer.writeBytes(se nten ce+n); / 客户端发送消息到服务器端modifiedSe nte nee =in FromServer.readL in e();/ 客户端接收来自服务器的消息System.out.pri
5、 ntl n(clie nt receive from TCP server: + modifiedSe nten ce);/客户端显示服务器发送过来的消息clie ntSocket.close(); / 客户端关闭套接字(2)TCP服务器端 TcpServer.javaimport java.io.*;import java .n et.*;public class TcpServer public static void main(String argV) throws Exception Stri ng clie ntSe nte nce; 定义接收的消息Stri ng capitali
6、zedSe nten ce;/ 定义发送的消息ServerSocket welcomeSocket= new ServerSocket(6789);/创建一个ServerSocket实例,并指定本地端口,侦听该指定端口收到的连接while(true)Socket conn ecti on Socket = welcomeSocket.accept();/调用ServerSocket的accept()方法以获取下一个客户端连接,基于新建立的 客户端连接,创建一个 Socket实例,并由accept()方法返回。BufferedReader inF romClie nt = new Buffere
7、dReader( new In putStreamReader(conn ectio nSocket.getl nputStream(); 创建客户端输入流DataOutputStream outToClie nt = new DataOutputStream(c onnection Socket.g etOutputStream(); 创建服务器输出流/ 使用所返回的Socket实例的InputStream和Outputstream与客户端进行通信。接收客户发送的信息clie ntSe nte nee = inF romClie nt.readLi ne(); /转换接收到输出给客户构造数据
8、包套接capitalizedSe ntence = clie ntSe nten ce.toUpperCase()+n; /的信息,小写变大写outToClient.writeBytes(TCP accept +capitalizedSentence);/ 端(3)UDP通信服务器端 UDPServer.javaimport java.io.*;import java .n et.*;public class UDPServer public static void main(String argV) throws Exception DatagramSocket serverSocket =
9、 new DatagramSocket (9876); /字并将其绑定到主机上的端口 9876服务器从客户端接收到的信息服务器发送给客户端的信息byte receiveData = new byte1024; /byte sen dData = new byte1024; /while(true)3 / 22DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveD ata.length); / 创建从客户端数据包serverSocket.receive(receivePacket); / 服务器从客户端接收数据
10、包String sentence = new String(receivePacket.getData(); / 服务器接打开 数据包得到消息InetAddress IPAddress = receivePacket.getAddress();/ 获取客户端的 IP 地 址int port = receivePacket.getPort();/ 获取客户端端口String capitalizedSentence = sentence.toUpperCase();/ 将接收的信息转为 大写sendData = capitalizedSentence.getBytes(); / 转换后的消息/ 服
11、务器发送给客户端的数据包,将转换后的消息打包DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.lengt h,IPAddress,port);serverSocket.send(sendPacket);/ 服务器发送数据包给客户端(4)UDP通信客户端 UDPCIient.javaimport java.io.*;import .*;pubIic cIass UDPCIientpubIic static void main(String argv) throws Exception byte receiveData
12、 = new byte1024; / 客户端接收的消息byte sendData = new byte1024; / 客户端发送的消息BufferedReader inFromReader = new BufferedReader( new InputStreamReader(Sy stem.in);/ 客户输入流DatagramSocket cIientSocket = new DatagramSocket (); / 客户端数据包套接字InetAddress IPAddress = InetAddress.getLocaIHost(); / 获取本机 IP 地址String sentenc
13、e = inFromReader.readLine(); / 客户端读取用户所输入的消息sendData = sentence.getBytes(); / 复制到要发送的消息/ 客户端发送的数据包,这里将客户端要发送的消息,客户端的 IP 地址,端口打包DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.Iength,IPAddress,9876);cIientSocket.send(sendPacket);/ 客户端套接字发送数据包/ 客户端接收的数据包,数据包包含从服务器接收的消息,消息长度DatagramPac
14、ket receivePacket = new DatagramPacket(receiveData,receiveData.Iength);cIientSocket.receive(receivePacket); / 客户端接收数据包String modifiedSentence = new String(receivePacket.getData(); / 将接收的数据包解开System.out.printIn(cIient receive from UDP server: + modifiedSentence + from from the cIient!); / 客户端显示数据包里的消
15、息cIientSocket.cIose(); / 关闭套接字通过TCP协议与回馈服务器(echo server )进行通信的客户端 TCPEchoClient.javaimport java.i o.I OExcepti on;import java.i o.ln putStream;import java.io.OutputStream;import java .n et.ServerSocket;import java .n et.Socket;import java .n et.SocketAddress;public class TCPEchoServerprivate static
16、final int BUFSIZE = 32;public static void main( Stri ng args) throws IOExcepti onif (args.le ngth != 1)/ 获取启动服务的端口throw new IllegalArgumentException(Parameter(s): );int servPort = In teger.parse In t(args0);/分配一个端口用于启动 server端ServerSocket servSock = new ServerSocket(servPort);int recvMsgSize;byte re
17、ceiveBuf = new byteBUFSIZE;while (true)Socket cl ntSock = servSock.accept(); / 接收客户端的主动连接SocketAddress clie ntAddress = cln tSock.getRemoteSocketAddress();System.out.println(Handling client at + clientAddress);In putStream in = cln tSock.getI nputStream();OutputStream out = cln tSock.getOutputStream
18、();while (recvMsgSize = in. read(receiveBuf) != -1) out.write(receiveBuf, 0, recvMsgSize);cln tSock.close();为前面的客户端程序实现回馈服务器 TCPEchoServer.javaimport java.i o.I OExcepti on;import java.i o.ln putStream;import java.io.OutputStream;import java .n et.Socket;import java .n et.SocketExcepti on;public cla
19、ss TCPEchoClie ntpublic static void main(String args) throws IOExceptionif (args.length 3) / 传入的数据在 23 之间,0:地址1 :传输字符throw new IllegalArgumentException(Parameter(s): );Stri ng server = args0; / ip 地址或主机名称byte data = args1.getBytes();int servPort = (args .len gth = 3) ? In teger.parse In t(args2) : 7
20、;默认端口为75 / 22Socket socket = new Socket(server, servPort);System.out.pri ntln (C onn ected to server.se nding echo stri ng);In putStream in = socket.get In putStream();OutputStream out = socket.getOutputStream();out.write(data);int totalBytesRcvd = 0;int bytesRcvd;while (totalBytesRcvd data.length)
21、if (bytesRcvd = in.read(data, totalBytesRcvd,data.length - totalB ytesRcvd) = -1)throw new SocketExcepti on (C onnection closed prematurely); totalBytesRcvd += bytesRcvd;System.out.pri ntln (Received: + new Strin g(data);socket.close();(7)一客户一线程/二、每个客户端请求都新启一个线程的 Tcp服务端:import java.io.IOException;im
22、port java .n et.ServerSocket;import java .n et.Socket;import java.util.logg in g.Logger;public class TCPEchoServerThread public static void main(String args) throws Exception /IOExceptionServerSocket servSock = new ServerSocket(5500);Logger logger = Logger.getLogger(practical);while (true) Socket cl
23、n tSock = servSock.accept(); / Block wait ing for conn ectioThread thread = new Thread( new EchoProtocol(cl ntSock, logger); thread.start();logger.i nfo(Created and started Thread + thread.getName();(8)线程池/三、固定线程数的 Tcp服务端import java.i o.I OExcepti on;import java .n et.ServerSocket;import java .n et.
24、Socket;import java.util.logg in g.Level;import java.util.logg in g.Logger;public class TCPEchoServerPool public static void main(String args) throws IOException int threadPoolSize = 3; / Fixed ThreadPoolSizefinal ServerSocket servSock = new ServerSocket(5500);final Logger logger = Logger.getLogger(p
25、ractical);for (int i = 0; i Loadlco n(IDR_MAINFRAME);void CNetChatServerDlg:DoDataExcha nge(CDataExcha nge* pDX) AFX_DATA_MAP(CNetChatServerDlg) DDX_Co ntrol(pDX, IDC_PORT, m_portCtrl);DDX_Co ntrol(pDX, IDC_EDIT_MSG, m_editMsg);DDX_C on trol(pDX, IDC_SHOW_MSG, m_showMsg); DDX_Text(pDX, IDC_PORT, m_s
26、erverPort);BEGIN_MESSAGE_MAP(CNetChatServerDlg, CDialog) /AFX_MSG_MAP(CNetChatServerDlg) ON_MESSAGE(WM_SOCKET, On Socket) ON_WM_SYSCOMMAND()ON_WM_PAINT()7 / 22 ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_START_SERVER, OnStartServer) ON_BN_CLICKED(IDC_SEND_MSG, OnSendMsg) ON_EN_MAXTEXT(IDC_SHOW_MSG, OnMa
27、xtextShowMsg) /AFX_MSG_MAPEND_MESSAGE_MAP()BOOL CNetChatServerDlg:OnInitDialog()CDialog:OnInitDialog();SetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE); / Set small icon/ TODO: Add extra initialization hereCtrlState(FALSE); m_portCtrl.SetLimitText(5);/65535 return TRUE; / return TRUE unless you set the focus to a controlvoid CNetChatServerDlg:OnSysCommand(UINT nID, LPARAM lParam) if(nID & 0xFFF0) = SC_CLOSE & m_serverSocket != INVALID_SOCKET) OnStartServer();CDialog:OnSysCommand(nID, lParam);void CNetChatServerDlg:OnPaint() if (I
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1