计网实验二 套接字编程.docx
- 文档编号:10557191
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:17
- 大小:141.23KB
计网实验二 套接字编程.docx
《计网实验二 套接字编程.docx》由会员分享,可在线阅读,更多相关《计网实验二 套接字编程.docx(17页珍藏版)》请在冰豆网上搜索。
计网实验二套接字编程
计网实验二套接字编程
班级:
智能1401
姓名:
蒙寿伟
学号:
201408070120
一、实验目的
设计和实现UDP和TCP的套接字通信,理解套接字的工作原理。
二、实验步骤
(1)功能设计与说明
TCP:
Client和Server进行通信,Client和Server建立连接后,只有当Client端发送“connect”字符后,真正的通信连接才会建立,这模拟了Server端的密码验证功能,Server收到“connect”指令后,返回“ServerOK”给Client,正常通信开始。
当Client发送“bye”时,Server返回“ConnectionClose”,通信结束,之后Client再发信息Server端也不会进行任何处理。
UDP:
功能和UDP相同
(2)代码说明
TCPServer:
定义变量
ServerSockets;//创建socket对象
Socketclient;//从客户端接收数据
InputStreaminstr;//打开输入输出流
OutputStreamoutstr;
DataInputStreamdin;//封装输入输出流
DataOutputStreamdout;
初始化变量
s=newServerSocket(6666);
client=s.accept();
instr=client.getInputStream();
outstr=client.getOutputStream();
din=newDataInputStream(instr);
dout=newDataOutputStream(outstr);
功能主体:
将服务器的接收和发送放到子线程Run()中
TCPClient:
初始化变量:
客户端的寻址是“localhost”相当于127.0.0.1
Socketsoc=newSocket("localhost",6666);
//打开输入输出流
InputStreaminstr=soc.getInputStream();
OutputStreamoutstr=soc.getOutputStream();
//封装输入输出流
DataInputStreamdin=newDataInputStream(instr);
DataOutputStreamdout=newDataOutputStream(outstr);
功能主体:
Client的发送和接收功能放到两个不同的线程
UDPClient和UDPServer与TCP的实现相似,不同的是UDP不需要建立连接,即不需要等待UDPServer的开启。
(3)Socket原理说明
24.在一台主机上安装编译用java写的TCPClient和UDPClient程序,在另一台主机上安装编译TCPServer和UDPServer程序。
a.如果你在运行TCPServer之前运行TCPClient,将会发生什么现象?
为什么?
答:
如图,TCPClient打不开,抛出Exception异常。
TCP的通信需要建立连接,当TCPServer端没有打开时,运行TCPClient,那么连接建立失败,那么Socketsoc=newSocket("localhost",6666);初始化失败,程序无法运行。
b.如果你在运行UDPServer之前运行UDPClient,将会发生什么现象?
为什么?
答:
程序正常运行。
UDP通信不需要建立连接,没有Client和Server的严格区分,发送方的不会在意接收方是否在线,只负责将数据送出去。
c.如果你对客户机端和服务器端使用了不同的端口,将会发生什么现象?
答;客户机和服务器的端口之间没有直接的联系,客户端的端口号信息会发送到服务器端,所以不管客户端的端口号怎么变化都不会影响正常的通信。
25.假定在UDPClient.java中,我们使用
DatagramSocketclientSocket=newDatagramSocket(5432);
代替
DatagramSocketclientSocket=newDatagramSocket();
在UDPServer.java中是否有必要进行修改?
UDPClient和UDPServer中的套接字端口号是多少?
在变化之前他们是多少?
答:
没有必要进行修改,通过newDatagramSocket();UDPClient会获得一个随机的可行端口号,newDatagramSocket(5432);指定了UDPClient的端口号为5432,当端口5432空闲时,程序正常运行,当5432已经被占用时,程序将无法正常运行。
变化之前UDPServer的端口号:
8454
变化之前UDPClient的端口号:
63884
三、实验心得
通过这次实验,加深了我对UDP和TCP的Socket工作原理,UDP的通信不需要建立连接,只是尽力将数据发送出去,TCP通信需要建立连接,TCPClient开启之前,TCPServer必须要开启,一个服务器可以同时与多个客户端进行通信,一个客户端也可以同时与多个服务器进行连接。
因为每一个进程都由“IP+端口号”确定了唯一性。
Date:
2017/5/12
附件:
TCPClient:
publicclassTCPClientextendsFrameimplementsActionListener,Runnable{
privatestaticfinallongserialVersionUID=1L;
Socketsoc=newSocket("localhost",6666);
//打开输入输出流
InputStreaminstr=soc.getInputStream();
OutputStreamoutstr=soc.getOutputStream();
//封装输入输出流
DataInputStreamdin=newDataInputStream(instr);
DataOutputStreamdout=newDataOutputStream(outstr);
privateTextAreaTa=newTextArea();
privateTextFieldTf1=newTextField(23);
publicTCPClient()throwsIOException{
setTitle("TCP_Client");
setSize(400,300);
setVisible(true);
add(Ta,"Center");
PanelP=newPanel(newGridLayout(1,1,5,5));
PanelP1=newPanel();
P1.add(newLabel("发送的信息"));
P1.add(Tf1);
Tf1.addActionListener(this);//添加监听器
P.add(P1);
add(P,"South");
//s=newServerSocket(Integer.parseInt(Tf1.getText().toString()));
addWindowListener(newWindowAdapter(){//关闭窗口
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
});
(newThread(this)).start();
}
//发送数据
publicvoidactionPerformed(ActionEventarg0){
try{
Stringmsg=Tf1.getText().toString();
dout.writeUTF(msg);
Tf1.setText("");
Ta.append("Clientsenddatas:
"+msg+"\n");
}
catch(IOExceptione)
{
e.printStackTrace();
}
}
//接收数据
publicvoidrun(){
try{
while(true){
Thread.sleep(0);
Ta.append(soc.getInetAddress()+":
"+din.readUTF()+"\n");
}
}catch(IOExceptione){
e.printStackTrace();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args)throwsIOException{
newTCPClient();
}
}
TCPServer:
publicclassTCPServerextendsFrameimplementsActionListener,Runnable{
privatestaticfinallongserialVersionUID=1L;
//创建socket对象
ServerSockets;
//从客户端接收数据
Socketclient;
//打开输入输出流
InputStreaminstr;
OutputStreamoutstr;
//封装输入输出流
DataInputStreamdin;
DataOutputStreamdout;
//ServerOK标志
privatebooleanokflag=true;
JTextPaneJp=newJTextPane();
privateTextAreaTa=newTextArea();
publicTCPServer()throwsIOException{
setTitle("TCP_Server");
setSize(400,300);
setVisible(true);
add(Ta,"Center");
addWindowListener(newWindowAdapter(){//关闭窗口
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
});
//
s=newServerSocket(6666);
client=s.accept();
instr=client.getInputStream();
outstr=client.getOutputStream();
din=newDataInputStream(instr);
dout=newDataOutputStream(outstr);
(newThread(this)).start();
}
//接收数据
publicvoidrun(){
try{
while(true){
Stringmsg0=din.readUTF();
if(msg0.equals("connect")){
Ta.append(client.getInetAddress()+":
"+msg0+"\n");
okflag=true;
while(true){
//发送ServerOK
if(okflag){
Thread.sleep(100);
dout.writeUTF("ServerOK");
okflag=false;
}
//接收信息
Stringmsg=din.readUTF();
Ta.append(client.getInetAddress()+":
"+msg+"\n");
//断开连接
if(msg.equals("bye")){
dout.writeUTF("ConnectionClose");
break;
}
}
}
}
}catch(IOExceptione){
e.printStackTrace();
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args)throwsIOException{
newTCPServer();
}
publicvoidactionPerformed(ActionEventarg0){
//TODOAuto-generatedmethodstub
}
}
UDPServer:
publicclassUDPServerextendsFrameimplementsRunnable{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
//所有发送和接收的数据都将通过该套接字
privateDatagramSocketsoc=newDatagramSocket(8454);
privateDatagramPacketpac;
//ServerOK标志
privatebooleanokflag=true;
privateTextAreaTa=newTextArea();
publicUDPServer()throwsSocketException{
setTitle("UDP_Server");
setSize(400,300);
setVisible(true);
add(Ta,"Center");
addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
});
(newThread(this)).start();
}
//接收和发送数据
publicvoidrun(){
try{
while(true){
byte[]buf=newbyte[1024];
pac=newDatagramPacket(buf,buf.length);
soc.receive(pac);
Stringmsg=newString(pac.getData(),0,pac.getLength());
if(msg.equals("connect")){
Ta.append(pac.getAddress()+":
"+msg+"\n");
okflag=true;
while(true){
//发送ServerOK
if(okflag){
msg="ServerOK";
buf=msg.getBytes();
System.out.println(pac.getPort());
DatagramPacketD=newDatagramPacket(buf,buf.length,pac.getAddress(),pac.getPort());
soc.send(D);
okflag=false;
}
//接收信息
byte[]buf0=newbyte[1024];
pac=newDatagramPacket(buf0,buf0.length);
soc.receive(pac);
msg=newString(pac.getData(),0,pac.getLength());
Ta.append(pac.getAddress()+":
"+msg+"\n");
//连接断开
if(msg.equals("bye")){
msg="ConnectionClose";
buf=msg.getBytes();
DatagramPacketD=newDatagramPacket(buf,buf.length,pac.getAddress(),pac.getPort());
soc.send(D);
break;
}
}
}
}
}catch(IOExceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args)throwsIOException{
newUDPServer();
}
}
UDPClient:
publicclassUDPClientextendsFrameimplementsActionListener,Runnable{
privatestaticfinallongserialVersionUID=1L;
//分配一个可用的端口号
DatagramSocketsoc=newDatagramSocket();
privateTextAreaTa=newTextArea();
privateTextFieldTf1=newTextField(23);
publicUDPClient()throwsSocketException{
setTitle("UDP_Client");
setSize(400,300);
setVisible(true);
add(Ta,"Center");
PanelP=newPanel();
PanelP1=newPanel();
P1.add(newLabel("发送的信息"));
P1.add(Tf1);
Tf1.addActionListener(this);//添加监听器
P.add(P1);
add(P,"South");
addWindowListener(newWindowAdapter(){//监听关闭窗口
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
});
(newThread(this)).start();
}
//发送信息
publicvoidactionPerformed(ActionEventarg0){
try{
Stringmsg=Tf1.getText().toString();
//InetAddressadr=InetAddress.getByName("10.63.208.52");
DatagramPacketpac=newDatagramPacket(msg.getBytes(),msg.getBytes().length,InetAddress.getLocalHost(),8454);
soc.send(pac);
Tf1.setText("");
Ta.append("Clientsenddatas:
"+msg+"\n");
}catch(IOExceptione){
e.printStackTrace();
}
}
///接收信息
publicvoidrun(){
try{
while(true){
byte[]buf=newbyte[1024];
DatagramPacketD=newDatagramPacket(buf,buf.length);
soc.receive(D);
Stringmsg=newString(D.getData(),0,D.getLength());
Ta.append(D.getAddress()+":
"+msg+"\n");
}
}catch(IOExceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args)throwsIOException{
newUDPClient();
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计网实验二 套接字编程 实验 套接 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)