2023年7月15日发(作者:)
甘肃政法学院 本科生实验报告
( )
姓名:
学院:计算机科学院
实验课程名称:tcp/ip协议与实现 实验日期: 年 月 日 指导教师及职称:
实验成绩:
开课时间: 学年 学期
甘肃政法学院实验管理中心印制
篇二:套接字编程实验报告
programing 实验
物联2班 2 赵智慧
一、 实验题目:利用套接字编程,编写出tcp和udp的客户机、服
务器程序进行交互
二、 实验代码:
1. tcp服务器:
package tcp;
import edreader;
import ption;
import treamreader;
import socket;
import ;
public class tcpserver {
public static void main(string[] args) throws ioexception{
serversocket server=new serversocket(7999);
n(server ok);
socket socket=();
bufferedreader bf=new bufferedreader(new
inputstreamreader(utstream()));
string str=ne();
while(str!=null)
{
n(str);
str=ne();
}
}
}
2. tcp客户机:
package tcp;
import edreader;
import tputstream;
import ption;
import treamreader;
import stream;
import riter; import ;
import nhostexception;
public class tcpclient {
public static void main(string[] args) throws unknownhostexception,
ioexception{
string sentence;
inputstreamreader isr = new inputstreamreader();
bufferedreader infromuser = new bufferedreader(isr);
socket clientsocket = new socket(127.0.0.1,7999);
sentence = ne();
outputstream os = putstream();
printwriter oos=new printwriter(os);
(es());
();
}
}
3. udp服务器:
package udp;
import ampacket;
import amsocket;
import dress;
import exception;
public class udpserver {
public static void main(string[] args) throws exception{
datagramsocket serversocket = new datagramsocket(9876); //所有发送和接收的数据都将通过该套接字
//因为udp无连接,所以无需创建一个新的套接字监听新的请求
byte[] receive1 = new byte[1024];
byte[] receive2 = new byte[1024];
byte[] send1 = new byte[1024];
byte[] send2 = new byte[1024];
byte[] send3 = new byte[1024];
while(true){
datagrampacket receivepacket = new datagrampacket(receive1, );
e(receivepacket);
string str = new string(a()); //从分组中提取出数据,并存入str中
inetaddress ip = ress(); //提取ip地址
int port = t(); //提取客户机端口号
string ask = 请选择:1.将其转化为大写 2.将a字符替换为c字符;
send1 = es();
datagrampacket sendpacket1 = new datagrampacket(send1, , ip,port);
(sendpacket1);
datagrampacket receivepacket2 = new datagrampacket(receive2, ); e(receivepacket2);
string str2 = new string(a());
if(array()[0]==1){
string capitalizedsentence = rcase();
send3 = es();
datagrampacket sendpacket3 = new datagrampacket(send3, , ip,port);
(sendpacket3);
}
else{
string change = e(a, c);
send2 = es();
datagrampacket sendpacket2 = new
datagrampacket(send2, , ip,port);
(sendpacket2);
}
}
}
}
4. udp客户机:
package udp;
import edreader;
import ption;
import treamreader;
import ampacket;
import amsocket;
import dress;
import exception;
import nhostexception;
public class udpclient {
public static void main(string[] args) throws ioexception{
inputstreamreader isr = new inputstreamreader();
bufferedreader infromuser = new bufferedreader(isr);
datagramsocket clientsocket = new datagramsocket(); //客户机套接字
inetaddress ipaddress = ame(127.0.0.1);
byte[] senddata1 = new byte[1024];
byte[] senddata2 = new byte[1024];
byte[] receivedata1 = new byte[1024];
byte[] receivedata2 = new byte[1024];
string sentence = ne();
senddata1 = es();
datagrampacket sendpacket = new datagrampacket(senddata1,
,ipaddress,9876);
(sendpacket);
datagrampacket receivepacket1 = new datagrampacket(receivedata1, );
e(receivepacket1);
string modifieddata1 = new string(a());
n(server:+modifieddata1);
string sentence2 = ne();
senddata2 = es();
datagrampacket sendpacket2 = new datagrampacket(senddata2,
,ipaddress,9876);
(sendpacket2);
datagrampacket receivepacket2 = new datagrampacket(receivedata2,
);
e(receivepacket2);
string modifieddata2 = new string(a());
n(server:+modifieddata2);
();
}
}
三、 实验分析: tcp提供可靠的数据传输,而udp提供不可靠的运输服务,在套接字编程方面,udp客户机使用的是datagramsocket,而tcp客户机使用的是socket。
tcp实现:
(1) 客户机从键盘输入读取一行字符,并通过套接字将该行发送到服务器
(2) 服务器从其套接字读取一行数据
(3) 服务器将来自客户机的数据打印出来
udp实现:
(1) 客户机从其键盘输入读取一行字符,并通过套接字将该行发送到服务器
(2) 服务器从其套接字读取一行数据
(3) 服务器发送可供选择的操作信息发送给客户机
(4) 客户机从其套接字读取来自服务器的信息,并将其选择通过套接字发送给服务
器
(5) 服务器通过套接字读取到客户机的选择,并根据是选择转换大小写还是选择替
换字符来将修改后的行通过套接字发送给客户机
(6) 客户机从其套接字中读取按照自己选择修改后的行,并打印显示出来
四、 运行结果:篇三:tcp套接字编程实验报告
西北师范大学计算机科学与工程学院
课程实验报告
1
2
3
4
篇四:c#套接字网络实验报告
计算机网络实验报告
年级 2009级 学号 2009432113 姓名 吴紫薇 成绩 专业
09计科1 实验地点 主楼502 指导教师 蔡红云 实验项目 套接字 实验日期一、实验目的 1、了解网络通信原理。
2、实现基于tcp或udp的网络通信数据传输服务。
3、掌握客户端/服务器程序设计。
4、掌握socket编程的原理和实现方法。
二、实验原理
1、套接字(socket)原理
套接字,是支持tcp/ip的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端面点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程
要通过internet进行通信,至少需要一对套接字,其中一个运行在客户端,称之为clientsocket,另一个运行于服务器端面,称为serversocket。根据连接启动的方式以及本地要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听、客户端请求、连接确认。
服务器监听是指服务端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求是由客户端的套接字提出连接请求,要连接的目标是服务器端套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字的地址和端口号,然后再向服务器端套接字提出连接请求。
连接确认是当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的信息发送给客户端,一旦客户端确认了此连接,连接即可建立。而服务器端继续处于监听状态,继续接收其他客户端的连接请求。
2、套接字通信原理图
图(1) 套接字工作流程图
3、套接字通信工作过程
(1)、建立连接
服务器(serversocket)监听指定端口,看是否有客户端的连接请求;客户端(clientserver)创建套接字并通过指定端口请求与服务器建立连接。服务器收到连接请求后,创建一个套接字与客户端建立连接。
(2)、数据通信
客户端通过套接字把请求发送给服务器,服务器处理请求并把结果通过套接字送回。
(3)、断开连接
服务器和客户端关闭套接字。
三、实验要求
服务器:
1、打开一通信通道并声明它愿意在某一个ip地址及某一端口上接收客户端请求。
2、等待客户请求到达该端口。
3、接收到服务请求,处理该请求并发送应答信号。
4、返回第二步,继续等待客户请求。
5、关闭服务器。
客户端:
1、打开一通信通道,并连接到服务器所在主机的指定端口。
2、向服务器发送服务请求报文,等待并接收应答,继续提出请求。
3、请求结束后关闭通信通道并终止。 通过以上方式实现客户端与服务器之间的通讯。
四、实验结果(程序)分析
a、套接字程序所需的函数:
1、创建套接字——socket()
serversocket = new socket(etwork, ,
);
功能:使用前创建一个新的套接字
2、指定本地地址——bind()
ipaddress ip = ;//提供一个ip地址,指示服务器应侦听所有网络接口上的客户端活动
serverinfo = new ipendpoint(ip, t());//getport()获得端口号
(serverinfo);//将socket接口和ip端口绑定
功能:将ip地址与端口号绑定到socket上。
3、监听连接——listen()
(10);//开始监听,并且挂起数为10
功能:用于将socket置于侦听状态,表明它愿意接收连接。
4、建立套接字连接——connect()和accept()
private void cmdenter_click(object sender, eventargs e)
{
//设定服务端ip和端口信息,这里的ip可以是127.0.0.1,可以是本机局域网ip,也可以是本机网络ip serverinfo = new
ipendpoint((),
32());
try
{
t(serverinfo);
//客户端连接服务端指定ip端口,socket
(es(好友: + + 进来了哦!!! +ng()+n));
//beginreceive:开始从连接的socket异步读取数据。接收来自服务器,其他客户端转发来的信息 //asynccallback引用在异步操作完成时调用的回调方法
eceive(msgbuffer, 0, , ,
new
asynccallback(receivecallback), null);//reveivecallback未定义
+= 登录服务器成功! +ng()+n;
d = true;
d = false;
d = true;
}
catch
{
(登录服务器失败,请确认服务器是否正常工作!);
}
} 功能:客户端请求连接服务器。
private void recieveaccept()
{
while (true)
{
//accept以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的socket
//在阻止模式中,accept将一直处于阻止状态,直到传入的连接尝试排入队列。连接被接受后,原来的socket
继续将传入的连接请求排入队列,直到您关闭它。
clientsocket[clientnumb] = ();//为新建连接创建新的套接字
clientsocket[clientnumb].beginreceive(msgbuffer, 0, ,
, new asynccallback(recievecallback), clientsocket[clientnumb]);
(clientsocket[clientnumb].ng()
+ 成功连接服务器.);
clientnumb++;//客户端数量加1
}
}
功能:服务器与客户端建立连接。
5、数据传输——send()与receive()
private void recievecallback(iasyncresult ar)//参数表示异步操作状态
{
try
{
socket rsocket = (socket)tate;//获取用户定义的对象它限定或包含关于异步操作的信息 int rend = eive(ar);//结束挂起的异步读取
//对每一个侦听的客户端端口信息进行接收和回发
for (int i = 0; i < clientnumb; i++)
{
if (clientsocket[i].connected)//已经建立连接
{
//回发数据到客户端
clientsocket[i].send(msgbuffer, 0, rend, );
}
//同时接收客户端回发的数据,用于回发
eceive(msgbuffer, 0, , 0, new
asynccallback(recievecallback), rsocket);
}
}
catch
{ }
}
功能:数据的发送与接收 6、关闭套接字——close ()
();//线程终止
();//关闭socket
功能:客户端与服务器断开连接,关闭套接字。
此程序可实现广播式服务器/客户端聊天,客户端通过服务器将数据传送给其它客户端而实现群聊功能。在可显示用户的进入与离开。
b 程序效果图
服务器窗口:
客户端窗口:
五、实验感想
套接字是一个以前完全没有接触过的东西,当老师布置了这个实验以后,压根就不知道套接字仨字怎么写,只好上网查了很多有关套接字的解释与编程代码。从完全不知道这是什么到编程,经历了挺长一段时间,因为没有人讲解,不懂得如何做,还搁置了很久。不过最后还是硬着头皮敲出了一个只能广播不能点对点的聊天工具。之所以说敲代码不说写代码是因为大多代码是在网上拼出来的,只是我自己敲了出来并做了注释。虽然这个程序的实用价值几乎为0,但是在它成功运行的时候还是很开心。不仅是完成了作业,更重要的是在编程之路上又迈进了一步。篇五:计网实验三套接字编程 实验报告
云南大学软件学院
实 验 报 告
课程: 计算机网络原理实验 任课教师:
姓名: 学号: 专业: 信息安全 成绩: 姓名: 学号: 专业: 信息安全 成绩:
实验三、套接字编程
1.实验目的:
两人一组,编写一个客户端、服务器程序,掌握socket编程原理。
2.实验环境:
连入局域网络的主机一台。
3.实验指导:
socket api是实现进程间通信的一种编程设施,也是一种为进程间提供底层抽象的机制。理解socket编程模型及其原理。
4.实验分析,回答下列问题。
a.运行指导书中的程序,并修改服务器的功能(自己思考),附上修改后的源代码,并加关键代码注释。
改写后的实验源代码
1)服务器:
#include stdafx.h
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#include <errno.h>
#include<winsock2.h>
#define myport 3490 /*定义用户连接端口*/ #define backlog
10 /*多少等待连接控制*/ #define server_ip_addr 113.55.16.115
/*服务器的ip地址*/ int main(int argc, tchar* argv[]) {
socket sock, msgsock;
int length = 0;
struct sockaddr_in server;
struct sockaddr tcpaddr;
char buf[1024] = ;
int rval= 0, len= 0, err = 0;
word wversionrequested;
wsadata wsadata;
/*指定socket版本,否则创建socket失败,即使创建socket返回值不为-1,但是bind时会失败*/
wversionrequested = makeword( 2, 2 );
err = wsastartup( wversionrequested, &wsadata );
if ( err != 0 )
return -1;
/* 建立套接字*/
sock = socket(af_inet, sock_stream, 0);
if (sock < 0)
{
perror(opening stream socket);
exit(1);
}
/* 使用任意端口命名套接字*/
_family = af_inet;
_port = htons(myport);
_addr.s_addr = inet_addr(server_ip_addr);
memset(_zero, 0, sizeof(_zero));
//将服务器地址与socket绑定在一起
rval = bind(sock, (struct sockaddr *)&server, sizeof(server));
if (rval < 0)
{
perror(binding stream socket);
exit(1);
}
// 找出指定的端口号并打印出来
length = sizeof(server);
if (getsockname(sock, (struct sockaddr *)&server, &length) < 0)
{
perror(getting socket name);
exit(1);
}
printf(端口号 #%dn, ntohs(_port));
// 开始接收连接,最大请求数为
listen(sock, 5); len = sizeof(struct sockaddr);
do
{
msgsock = accept(sock, (struct sockaddr *)&tcpaddr, (int *)&len);
if (msgsock == -1)
perror(accept);
else
{
for(;;)
{
memset(buf, 0, sizeof(buf));
if ( (rval = recv(msgsock, buf, sizeof(buf),0) < 0))
perror(连接中断);
if (rval == 0)
printf(响应方: %sn, buf);
gets(buf); //运用gets获取字符串
rval = send(msgsock, buf, strlen(buf) + 1,0); //当rval的值小于0的时候就会输出错误信息:“连接中断”.
//当rval=0的时候,就会扫描并接收到的客户端发来的信息打印出来
}
}
closesocket(msgsock);
} while (strcmp(buf,bye));
/* 因为这个程序已经有了一个无限循环,所以套接字sock从来不显式关闭。然而,当进程被杀死或正常终止时,所有套接字都将自动地被关闭。*/
closesocket(msgsock);
return 0;
}
2)客户端
#include stdafx.h
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <winsock2.h>
#define port 3490 /* 客户机连接远程主机的端口*/
#define maxdatasize 100 /* 每次可以接收的最大字节*/
int main(int argc, tchar* argv[])
{
word wversionrequested;
wsadata wsadata;
int err = 0 ,rval = 0 ;
socket fd;
struct sockaddr_in servaddr;
char buf[1024] = ; wversionrequested = makeword( 2, 2 );
err = wsastartup( wversionrequested, &wsadata );
for(;;)
{
if ( err != 0 )
return -1;
if ((fd = socket(af_inet, sock_stream, 0)) < 0)
{
printf(can not create socket!);
exit(2);
}
_family = af_inet;
_port = htons(port);
_addr.s_un.s_addr=inet_addr(113.55.16.115);
memset(_zero, 0, sizeof(_zero));
//和服务器创建连接
rval = connect(fd, (sockaddr*)&servaddr, sizeof(servaddr));
if (rval < 0)
{//创建连接失败
printf(can not create connect!);
exit(3);
}
else
{
for(;;)
{
memset(buf, 0, 1024);
printf(请输入(客户端):);
gets(buf);//通过此函数实现发送完整字符串
rval = send(fd, buf, strlen(buf) + 1,0);
if(rval < 0)
printf(错误!);
memset(buf, 0, sizeof(buf));
if ( (rval = recv(fd, buf, sizeof(buf),0) < 0))
perror(连接中断);
if (rval == 0)
printf(发起方: %sn, buf);
} //当rval的值小于0的时候就会输出错误信息:“连接中断”.
//当rval=0的时候,就会输出你将要发送到服务器的信息。
}
}
closesocket(fd);
system(pause);//在客户端程序代码最后return 0;之前加上代码system(”puse”);这样就可以做到打开一次多次发送消息。 return 0;
}
b.给出程序调试和运行的截图。
c.回答下列问题:
(1) 为什么在服务器和客户端要包含winsock2.h文件?
答:这是系统自定义的“宏”,其中还包含了许多自定义的类型,如果不包含该文件,程序中会有许多类型无法识别。
句,如果不加会出现什么问题?
答:加入这一句是要链接api相关连的ws2_静态库。如果不使用这个语句,就不能调用ws2_从而使用winsock2.h文件,此时程序里的很多函数和变量就不能使用。
(3) 为什么在服务器和客户端程序中要使用wsastartup函数,如果不用程序会有什么问
题?
答:为了在应用程序当中调用任何一个winsock api函数,如果不使用,当一个应用程序调用wsastartup函数时,操作系统就不能根据请求的socket版本来搜索相应的socket库,也不能绑定找到的socket库该应用程序。应用程序也不就可以调用所请求的socket库中的其它socket函数了。
(4) 如果服务器程序中没有memset(_zero, 0,
sizeof(_zero));
语句,程序会出现什么错误,为什么?
答:这个函数通常为新申请的内存做初始化工作,其返回值为指向s的指针,所以,程序中如果没有该语句,就不能申请到_zero的内存,产生错误。
(5) 如果先运行客户端程序,程序会有什么现象,为什么会有这一现象?
答:客户端的一头会显示“无法连接”的字样,这是因为服务器端的还未打开,客户端得不到相应的回应。
(6) 如果服务器程序所在计算机没有连接网络,程序会发生什么错误?我们捕获到什么
错误信息?
答:服务器地址与socket不能绑定,捕获信息:binding stream socket:no error。
(7) 总结实验过程中出现的问题和解决的办法。
1.刚开始对于socket编程不是很了解,所以在运行程序及调试程序的过程中存在很多的问题,比如看不懂程序中某段代码的意义,不清楚程序的轮廓。鉴于此,通过老师在课堂上对程序的讲解及课下上网的搜索,慢慢的大致清楚了程序设计的基本思路。
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689410089a243521.html
评论列表(0条)