实验二网络基础编程实验.docx

上传人:b****1 文档编号:1740412 上传时间:2023-05-01 格式:DOCX 页数:28 大小:264.37KB
下载 相关 举报
实验二网络基础编程实验.docx_第1页
第1页 / 共28页
实验二网络基础编程实验.docx_第2页
第2页 / 共28页
实验二网络基础编程实验.docx_第3页
第3页 / 共28页
实验二网络基础编程实验.docx_第4页
第4页 / 共28页
实验二网络基础编程实验.docx_第5页
第5页 / 共28页
实验二网络基础编程实验.docx_第6页
第6页 / 共28页
实验二网络基础编程实验.docx_第7页
第7页 / 共28页
实验二网络基础编程实验.docx_第8页
第8页 / 共28页
实验二网络基础编程实验.docx_第9页
第9页 / 共28页
实验二网络基础编程实验.docx_第10页
第10页 / 共28页
实验二网络基础编程实验.docx_第11页
第11页 / 共28页
实验二网络基础编程实验.docx_第12页
第12页 / 共28页
实验二网络基础编程实验.docx_第13页
第13页 / 共28页
实验二网络基础编程实验.docx_第14页
第14页 / 共28页
实验二网络基础编程实验.docx_第15页
第15页 / 共28页
实验二网络基础编程实验.docx_第16页
第16页 / 共28页
实验二网络基础编程实验.docx_第17页
第17页 / 共28页
实验二网络基础编程实验.docx_第18页
第18页 / 共28页
实验二网络基础编程实验.docx_第19页
第19页 / 共28页
实验二网络基础编程实验.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

实验二网络基础编程实验.docx

《实验二网络基础编程实验.docx》由会员分享,可在线阅读,更多相关《实验二网络基础编程实验.docx(28页珍藏版)》请在冰点文库上搜索。

实验二网络基础编程实验.docx

实验二网络基础编程实验

计算机网络》

实验报告

信息安全

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(totalBytesRcvd

if((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;i

Threadthread=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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2