基于TCP和UDP的socket编程.docx
- 文档编号:17959328
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:12
- 大小:223.69KB
基于TCP和UDP的socket编程.docx
《基于TCP和UDP的socket编程.docx》由会员分享,可在线阅读,更多相关《基于TCP和UDP的socket编程.docx(12页珍藏版)》请在冰点文库上搜索。
基于TCP和UDP的socket编程
1课程设计名称
网络编程实验
2课程设计目的
1.通过基于TCP的Socket程序的编写、调试,掌握以下知识点:
1)Socket的编程方法;
2)基于TCP协议的网络应用的传输特点。
2.通过基于UDP的Socket程序的编写、调试,掌握以下知识点:
1)Socket的编程方法;
2)基于UDP协议的网络应用的传输特点。
3实验环境
Windows,JDK1.8,文本编辑器
4实验内容(算法、程序、步骤和方法)
4.1实验背景
Socket,通常也称作“套接字”,是TCP/IP网络的编程的接口(API),用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。
常用的Socket类型有两种:
流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。
流式Socket是为面向连接的应用服务提供的一种接口,数据报式Socket是为无连接的服务提供的一种接口,本实验中,通过java语言编写的基于TCP/UDP的客户/服务器程序,让学生了解面向连接的网络应用程序的工作原理及其Socket程序设计的方法。
4.2实验准备
4.2.1TCP部分
1.实验要求利用JAVA语言编写基于TCP的网络应用程序,需要了解下面相关知识:
1)TCP/UDP基于字节流传输的基本原理;
2)Socket的相关知识;
3)Java编程基础,熟悉Java下的Socket类与ServerSocket类的方法。
2.基于TCP的Socket编程,需要完成客户端和服务器两部分的程序设计。
在代码开发之前,需要对网络层应用的协议进行详细设计,本实验的应用层协议设计如下:
(1)协议的格式:
ACSII码字符,回车作为消息的结束。
(2)协议的工作原理
(2-1)客户端:
从标准键盘中读入一行字符,通过Socket发送到服务器;收到服务器反馈的信息,将信息显示在标准输出屏幕上;关闭连接。
(2-2)服务器端:
从Socket中读出客户端发送的字符串信息;计算字符串的长度;将计算的结果通过Socket发送给客户端。
4.2.2UDP部分
1.实验要求利用JAVA语言编写基于UDP的字符串逆序转换的网络应用程序,需要了解下面相关知识:
1)UDP基于字节流传输的基本原理;
2)Socket的相关知识;
3)Java编程基础,Java下的DatagramSocket类的方法。
2.基于UDP的Socket编程,需要完成客户端和服务器两部分的程序设计。
在代码开发之前,需要对网络层应用的协议进行详细设计,本实验的应用层协议设计如下:
(1)协议的格式:
ACSII码字符,回车作为消息的结束。
(2)协议的工作原理
(2-1)客户端:
从标准键盘中读入一行字符,通过Socket发送到服务器;收到服务器反馈的信息,将信息显示在标准输出屏幕上;关闭连接。
(2-2)服务器端:
从Socket中读出客户端发送的字符串信息;进行逆序转换;将转换的结果通过Socket发送给客户端。
4.3实验步骤
4.3.1TCP部分
1.画好实现代码的流程图:
TCP
connectionsetup
2.编写TCPServer.java
importjava.io.*;
import.*;
classTCPServer{
publicstaticvoidmain(Stringargv[])throwsException{
StringclientSentence;
StringsentenceLength;
ServerSocketwelcomeSocket=newServerSocket(6789);
while(true){
SocketconnectionSocket=welcomeSocket.accept();
BufferedReaderinFromClient=newBufferedReader(newInputStreamReader(connectionSocket.getInputStream()));
DataOutputStreamoutToClient=newDataOutputStream(connectionSocket.getOutputStream());
clientSentence=inFromClient.readLine();
sentenceLength=String.valueOf(clientSentence.length())+'\n';
outToClient.writeBytes(sentenceLength);
}
}
}
编写TCPClient.java
importjava.io.*;
import.*;
classTCPClient{
publicstaticvoidmain(Stringargv[])throwsException{
Stringsentence;
StringsentenceLength;
BufferedReaderinFromUser=newBufferedReader(newInputStreamReader(System.in));
SocketclientSocket=newSocket("DESKTOP-2PC4RS3",6789);
DataOutputStreamoutToServer=newDataOutputStream(clientSocket.getOutputStream());
BufferedReaderinFromServer=newBufferedReader(newInputStreamReader(clientSocket.getInputStream()));
sentence=inFromUser.readLine();
outToServer.writeBytes(sentence+'\n');
sentenceLength=inFromServer.readLine();
System.out.println("FromServer:
"+sentenceLength);
clientSocket.close();
}
}
3.在命令行中,分别通过javacTCPServer.java和javacTCPClient.java命令对客户端和服务器的源代码程序进行编译,编译结果如下:
4.在命令行中输入javaTCPServer启动服务器端程序:
5.新建一个命令行窗口,输入javaTCPClient启动客户端程序:
6.在客户端输入“abcdefg”,服务器端返回字符串长度的结果为“FromServer:
7”。
4.4.2UDP部分
1.画好实现代码的流程图:
CloseclientSocket
2.编写UDPServer.java
importjava.io.*;
import.*;
classUDPServer{
publicstaticvoidmain(Stringargs[])throwsException{
DatagramSocketserverSocket=newDatagramSocket(9876);
byte[]receiveData=newbyte[1024];
byte[]sendData=newbyte[1024];
byte[]sendModifiedData=newbyte[1024];
StringmodifiedSentence="";
while(true)
{
DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);
serverSocket.receive(receivePacket);
Stringsentence=newString(receivePacket.getData());
InetAddressIPAddress=receivePacket.getAddress();
intport=receivePacket.getPort();
char[]c=sentence.toCharArray();
for(inti=c.length-1;i>=0;i--)
{
modifiedSentence=modifiedSentence+c[i];
}
sendModifiedData=modifiedSentence.getBytes();
DatagramPacketsendPacket=newDatagramPacket(sendModifiedData,sendModifiedData.length,IPAddress,port);
serverSocket.send(sendPacket);
}
}
}
编写UDPClient.java
importjava.io.*;
import.*;
classUDPClient{
publicstaticvoidmain(Stringargs[])throwsException{
BufferedReaderinFromUser=newBufferedReader(newInputStreamReader(System.in));
newBufferedReader(newInputStreamReader(System.in));
DatagramSocketclientSocket=newDatagramSocket();
InetAddressIPAddress=InetAddress.getByName("DESKTOP-2PC4RS3");
byte[]sendData=newbyte[1024];
byte[]receiveData=newbyte[1024];
Stringsentence=inFromUser.readLine();
sendData=sentence.getBytes();
DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length,IPAddress,9876);
clientSocket.send(sendPacket);
DatagramPacketreceivePacket=newDatagramPacket(receiveData,receiveData.length);
clientSocket.receive(receivePacket);
StringmodifiedSentence=newString(receivePacket.getData());
System.out.println("FromServer:
"+modifiedSentence);
clientSocket.close();
}
}
3.在命令行中,分别通过javacUDPServer.java和javacUDPClient.java命令对客户端和服务器的源代码程序进行编译,编译结果如下:
4.在命令行输入javaUDPServer命令启动服务器端程序:
5.新建一个命令行窗口,输入javaUDPClient命令启动客户端程序:
6.在客户端输入“abcdefg”,服务器端返回字符串的结果为:
“FromServer:
gfedcba”。
5数据记录和计算
5.1思考题
1.如果在运行TCPServer之前运行TCPClient,将发生什么现象?
为什么?
如图,TCPClient打不开,抛出Exception异常。
原因:
TCP的通信需要建立连接,当TCPServer端没有打开时,运行TCPClient,连接失败,SocketclientSocket=newSocket("DESKTOP-2PC4RS3",6789);初始化失败,程序无法运行。
2.如果在运行UDPServer之前运行UDPClient,将发生什么现象?
为什么?
如图,程序正常运行。
原因:
UDP通信不需要连接,没有Client和Server的严格区分,发送方不会在意接收方是否在线,只负责将数据送出去。
6结论(结果)
顺利完成基于TCP和UDP的网络编程。
7小结
本次实验让我对TCP和UDP协议有了更加深刻的认识,熟悉了基于TCP和UDP的网络编程。
8备注或说明
1.本次实验的成功归功于助教姐姐的帮助和自己网上寻找资料以及和同学的交流,在以后的实验中我会继续努力的。
2.刚开始编程的时候没有注意到对字符串的处理是在服务器端完成的,导致之后需要对程序进行修改,虽然不是很麻烦,但是也花费了一定时间,以后我会更加细心的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 TCP UDP socket 编程