实验二网络基础编程实验.docx
《实验二网络基础编程实验.docx》由会员分享,可在线阅读,更多相关《实验二网络基础编程实验.docx(28页珍藏版)》请在冰豆网上搜索。
实验二网络基础编程实验
计算机网络》
实验报告
信息安全
2015年4月1日
实验二网络基础编程实验
一、实验目的
通过本实验,学习采用Socket(套接字)设计简单的网络数据收发程序,理解应用数据包是如何通过传输层进行传送的。
二、实验内容
2.1、编写TCP进行数据发送的简单程序(java)
TCPCIient.javTaCPServer.java
UDPServer.javaUDPCIient.java
2.3多线程线程池对比
TCPEchoCIient.java
2.4写一个简单的chat程序,编程语言不限。
三、实验程序
(1)TCP客户端TcpCIient.java|
importjava.io.*;
importjava.net.*;
publicclassTcpClient{
publicstaticvoidmain(Stringargv[])throwsException{
Stringsentence;〃定义客户消息
StringmodifiedSentence;〃定义服务器消息
InetAddressaddress=InetAddress.getLocalHost();〃获取本机端口
BufferedReaderinFromUser=newBufferedReader(newInputStreamReader(Syst
em.in));//创建客户输入流
//创建一个Scoket实例:
构造函数向指定的远程主机和端口建立一个TCP连接。
add
ress.getHostName()为本机IP地址;6789为TCP服务器端口
SocketclientSocket=newSocket(address.getHostName(),6789);//客户套接字
//通过套接字的输入输出流(I/Ostreams)进行通信
DataOutputStreamoutToServer=newDataOutputStream(clientSocket.getOutput
Stream());II创建客户端到服务器的输出流
BufferedReaderinFromServer=newBufferedReader(newInputStreamReader(cli
entSocket.getInputStream()));II创建服务端输入流
sentence=inFromUser.readLine();〃客户端读取客户输入消息
outToServer.writeBytes(sentence+'\n');//客户端发送消息到服务器端
modifiedSentenee=inFromServer.readLine();//客户端接收来自服务器的消息
System.out.println("clientreceivefromTCPserver:
"+modifiedSentence);/
/客户端显示服务器发送过来的消息
clientSocket.close();//客户端关闭套接字
}
}
(2)TCP服务器端TcpServer.java
importjava.io.*;
importjava.net.*;
publicclassTcpServer{
publicstaticvoidmain(StringargV[])throwsException{
StringclientSentence;〃定义接收的消息
StringcapitalizedSentence;//定义发送的消息
ServerSocketwelcomeSocket=newServerSocket(6789);
//创建一个ServerSocket实例,并指定本地端口,侦听该指定端口收到的连接
while(true){
SocketconnectionSocket=welcomeSocket.accept();
//调用ServerSocket的accept()方法以获取下一个客户端连接,基于新建立的客户端连接,创建一个Socket实例,并由accept()方法返回。
BufferedReaderinFromClient=newBufferedReader(newInputStreamReade
r(connectionSocket.getlnputStream()));〃创建客户端输入流
DataOutputStreamoutToClient=newDataOutputStream(connectionSocket.getOutputStream());〃创建服务器输出流
//使用所返回的Socket实例的InputStream和Outputstream与客户端进行通信。
接收客户发送的信息
clientSentenee=inFromClient.readLine();//
转换接收到
输出给客户
构造数据包套接
capitalizedSentence=clientSentence.toUpperCase()+'\n';//
的信息,小写变大写
outToClient.writeBytes("TCPaccept"+capitalizedSentence);//端
}
}
}
(3)UDP通信服务器端UDPServer.java
importjava.io.*;
importjava.net.*;
publicclassUDPServer{
publicstaticvoidmain(StringargV[])throwsException{
DatagramSocketserverSocket=newDatagramSocket(9876);//
字并将其绑定到主机上的端口9876
服务器从客户端接收到的信息
服务器发送给客户端的信息
byte[]receiveData=newbyte[1024];//
byte[]sendData=newbyte[1024];//
while(true){
3/22
DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);//创建从客户端数据包
serverSocket.receive(receivePacket);//服务器从客户端接收数据包
Stringsentence=newString(receivePacket.getData());//服务器接打开数据包得到消息
InetAddressIPAddress=receivePacket.getAddress();//获取客户端的IP地址
intport=receivePacket.getPort();//获取客户端端口
StringcapitalizedSentence=sentence.toUpperCase();//将接收的信息转为大写
sendData=capitalizedSentence.getBytes();//转换后的消息
//服务器发送给客户端的数据包,将转换后的消息打包
DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,port);
serverSocket.send(sendPacket);//服务器发送数据包给客户端
}
}
}
(4)UDP通信客户端UDPCIient.java
importjava.io.*;
import.*;
pubIiccIassUDPCIient{
pubIicstaticvoidmain(Stringargv[])throwsException{
byte[]receiveData=newbyte[1024];//客户端接收的消息
byte[]sendData=newbyte[1024];//客户端发送的消息
BufferedReaderinFromReader=newBufferedReader(newInputStreamReader(System.in));//客户输入流
DatagramSocketcIientSocket=newDatagramSocket();//客户端数据包套接字
InetAddressIPAddress=InetAddress.getLocaIHost();//获取本机IP地址
Stringsentence=inFromReader.readLine();//客户端读取用户所输入的消息
sendData=sentence.getBytes();//复制到要发送的消息
//客户端发送的数据包,这里将客户端要发送的消息,客户端的IP地址,端口打包
DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.Iength,IP
Address,9876);
cIientSocket.send(sendPacket);//客户端套接字发送数据包
//客户端接收的数据包,数据包包含从服务器接收的消息,消息长度
DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.
Iength);
cIientSocket.receive(receivePacket);//客户端接收数据包
StringmodifiedSentence=newString(receivePacket.getData());//将接收的
数据包解开
System.out.printIn("cIientreceivefromUDPserver:
"+modifiedSentence+
"fromfromthecIient!
");//客户端显示数据包里的消息
cIientSocket.cIose();//关闭套接字
}}
⑸通过TCP协议与回馈服务器(echoserver)进行通信的客户端TCPEchoClient.java
importjava.io.IOException;
importjava.io.lnputStream;
importjava.io.OutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.net.SocketAddress;
publicclassTCPEchoServer{
privatestaticfinalintBUFSIZE=32;
publicstaticvoidmain(String[]args)throwsIOException{
if(args.length!
=1)//获取启动服务的端口
thrownewIllegalArgumentException("Parameter(s):
");
intservPort=Integer.parseInt(args[0]);
//分配一个端口用于启动server端
ServerSocketservSock=newServerSocket(servPort);
intrecvMsgSize;
byte[]receiveBuf=newbyte[BUFSIZE];
while(true){
SocketclntSock=servSock.accept();//接收客户端的主动连接
SocketAddressclientAddress=clntSock.getRemoteSocketAddress();
System.out.println("Handlingclientat"+clientAddress);
InputStreamin=clntSock.getInputStream();
OutputStreamout=clntSock.getOutputStream();
while((recvMsgSize=in.read(receiveBuf))!
=-1)out.write(receiveBuf,0,recvMsgSize);
clntSock.close();
}}}
⑹为前面的客户端程序实现回馈服务器TCPEchoServer.java
importjava.io.IOException;
importjava.io.lnputStream;
importjava.io.OutputStream;
importjava.net.Socket;
importjava.net.SocketException;
publicclassTCPEchoClient{
publicstaticvoidmain(String[]args)throwsIOException{
if((args.length<2)||(args.length>3))//传入的数据在2~3之间,0:
地址1:
传输字符<2:
端口>
thrownewIllegalArgumentException("Parameter(s):
[rt>]");
Stringserver=args[0];//ip地址或主机名称
byte[]data=args[1].getBytes();
intservPort=(args.length==3)?
Integer.parseInt(args[2]):
7;
〃默认端口为7
5/22
Socketsocket=newSocket(server,servPort);
System.out.println("Connectedtoserver...sendingechostring");
InputStreamin=socket.getInputStream();
OutputStreamout=socket.getOutputStream();
out.write(data);
inttotalBytesRcvd=0;
intbytesRcvd;
while(totalBytesRcvdif((bytesRcvd=in.read(data,totalBytesRcvd,data.length-totalBytesRcvd))==-1)
thrownewSocketException("Connectionclosedprematurely");totalBytesRcvd+=bytesRcvd;
}
System.out.println("Received:
"+newString(data));
socket.close();
}}
(7)一客户一线程
//二、每个客户端请求都新启一个线程的Tcp服务端:
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.util.logging.Logger;
publicclassTCPEchoServerThread{
publicstaticvoidmain(String[]args)throwsException{//IOException
ServerSocketservSock=newServerSocket(5500);
Loggerlogger=Logger.getLogger("practical");
while(true){
SocketclntSock=servSock.accept();//Blockwaitingforconnectio
Threadthread=newThread(newEchoProtocol(clntSock,logger));thread.start();
logger.info("CreatedandstartedThread"+thread.getName());
}}}
(8)线程池
//三、固定线程数的Tcp服务端
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.util.logging.Level;
importjava.util.logging.Logger;
publicclassTCPEchoServerPool{
publicstaticvoidmain(String[]args)throwsIOException{
intthreadPoolSize=3;//FixedThreadPoolSize
finalServerSocketservSock=newServerSocket(5500);
finalLoggerlogger=Logger.getLogger("practical");
for(inti=0;iThreadthread=newThread(){publicvoidrun(){
while(true){
try{
等待连接
等待
SocketclntSock=servSock.accept();//
EchoProtocol.handleEchoClient(cIntSock,logger);//
}catch(IOExceptionex){
logger.log(Level.WARNING,"Clientacceptfailed",e
x);
}}}};
thread.start();
logger.info("CreatedandstartedThread="+thread.getName());
}}}
(9)聊天程序服务器端NetChatServerDIg.cpp
#include"stdafx.h"#include"NetChatServer.h"
#include"NetChatServerDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE.
#endif
CNetChatServerDlg:
:
CNetChatServerDlg(CWnd*pParent/*=NULL*/):
CDialog(CNetChatServerDlg:
:
IDD,pParent)
{
m_serverPort=1130;m_serverSocket=INVALID_SOCKET;
m_clientSocket=INVALID_SOCKET;
memset(&m_clientAddr,0,sizeof(m_clientAddr));m_hIcon=AfxGetApp()->Loadlcon(IDR_MAINFRAME);
}
voidCNetChatServerDlg:
:
DoDataExchange(CDataExchange*pDX){〃{{AFX_DATA_MAP(CNetChatServerDlg)DDX_Control(pDX,IDC_PORT,m_portCtrl);
DDX_Control(pDX,IDC_EDIT_MSG,m_editMsg);
DDX_Control(pDX,IDC_SHOW_MSG,m_showMsg);DDX_Text(pDX,IDC_PORT,m_serverPort);
}
BEGIN_MESSAGE_MAP(CNetChatServerDlg,CDialog)//{{AFX_MSG_MAP(CNetChatServerDlg)ON_MESSAGE(WM_SOCKET,OnSocket)ON_WM_SYSCOMMAND()
ON_WM_PAINT()
7/22ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_START_SERVER,OnStartServer)ON_BN_CLICKED(IDC_SEND_MSG,OnSendMsg)ON_EN_MAXTEXT(IDC_SHOW_MSG,OnMaxtextShowMsg)//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOLCNetChatServerDlg:
:
OnInitDialog(){
CDialog:
:
OnInitDialog();
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
CtrlState(FALSE);m_portCtrl.SetLimitText(5);//65535returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCNetChatServerDlg:
:
OnSysCommand(UINTnID,LPARAMlParam){if((nID&0xFFF0)==SC_CLOSE&&m_serverSocket!
=INVALID_SOCKET)OnStartServer();
CDialog:
:
OnSysCommand(nID,lParam);
}
voidCNetChatServerDlg:
:
OnPaint(){
if(I