资源描述
淮海工学院计算机工程学院
实验报告书
课程名:计算机网络
题 目:基于Socket的C/S程序开发
班 级: G
学 号:
姓 名:
评语:
成绩: 指导教师:
批阅时间: 年 月 日
《计算机网络》实验报告 - 6 -
一、 实验目的
理解和巩固传输层与套接字的基本知识,掌握利用套接字实现面向连接的数据传输的一般方法,深入理解客户/服务器工作模式,学会简单的客户/服务器程序的开发。
二、 实验内容
利用Java语言提供的Socket技术,建立一个C/S模式的应用,允许客户端用户输入2个整数,服务器端接收这2个整数,并计算出它们的和、差、积、商,最后送回客户端。
服务器端ServerSocket类(。ServerSocket )
构造方法:public ServerSocket(int port) throws IOException-—S_1
接受连接请求:public Socket accept() throws IOException-—S_2
客户端Socket类(java。net。Socket)
构造方法:public Socket(String host, int port) throws UnknownHostException, IOException ——C_1
读取数据:public InputStream getInputStream() throws IOException-—S_5,C_3
发送数据:public OutputStream getOutputStream() throws IOException——S_3,C_4
服务器端编程
创建ServerSocket对象
ServerSocket server=new ServerSocket(8000);
监听来自客户端的请求
Socket linkSocket=server.accept();
与客户端进行通信
利用linkSocket。getInputStream() 接收客户端数据;
对读取的数据进行加、减、乘、除计算;
利用linkSocket.getoutputStream() 向客户端发送计算结果;
监听结束时关闭服务器
server。close();
客户端编程
建立连接
Socket client=new Socket(“ServerComputerName", 8000);
与服务器进行通信
从键盘读入两个整数;
利用client.getoutputStream() 向服务器端发送数据;
利用client.getInputStream() 接收服务器端结果;
显示从服务器端得到的结果;
释放连接
Client。close();
要求:在一台主机上安装并运行服务器端程序,在另一台计算机上安装并运行客户端程序,测试所编写的程序能否完成规定的功能。
三、 实验步骤与源程序
源程序:
服务器:
import 。*;
import java。util。*;
import java。io.*;
import java。awt.*;
import java。awt.event。*;
import javax.swing.*;
public class Server
{
public Server()
{ ServerSocket server=null;
Server_thread thread;
Socket you=null;
while(true)
{
try
{ server=new ServerSocket(8755); }
catch(IOException e1)
{ System。out.println(”正在监听");} //ServerSocket对象不能重复创建
try
{ System.out。println(”等待客户呼叫”);
you=server.accept();
System。out.println(”已连接到客户”);
System。out。println(”客户的地址:”+you.getInetAddress()); }
catch (IOException e)
{ System。out.println("正在等待客户”); }
if(you!=null)
{ new Server_thread(you).start();} //为每个客户启动一个专门的线程
}
}
public static void main(String args[])
{ new Server(); }
}
class Server_thread extends Thread
{
Socket socket;
DataOutputStream out=null;
DataInputStream in=null;
String s=null;
boolean quesion=false;
Server_thread(Socket t)
{ socket=t;
try
{ out=new DataOutputStream(socket。getOutputStream());
in=new DataInputStream(socket.getInputStream());
}
catch (IOException e){}
}
public void run()
{
while(true)
{ double a[]=new double[2]; int i=0;
try
{
s=in。readUTF();//堵塞状态,除非读取到信息
quesion=false;
StringTokenizer fenxi=new StringTokenizer(s,”,”);
while(fenxi.hasMoreTokens() && quesion==false)
{
String temp=fenxi。nextToken();
try
{ a[i]=Double.valueOf(temp)。doubleValue();i++; } catch(NumberFormatException e)
{ out。writeUTF("请输入数字字符”);
quesion=true;
}
}
if(quesion==false)
{
double s=a[0]+a[1]; double p=a[0]—a[1];
double q=a[0]*a[1]; double r=a[0]/a[1];
out。writeUTF(” ”+a[0]+"+”+a[1]+"="+s);
out.writeUTF(" ”+a[0]+”—”+a[1]+”=”+p);
out.writeUTF(" ”+a[0]+"*”+a[1]+”=”+q);
out。writeUTF(" "+a[0]+”/”+a[1]+"=”+r);
System。out。println("客服端数据:"+a[0]+”和"+a[1]);
System。out.println(”完成客户端运算”);
}
}
catch (IOException e)
{
System。out。println("客户离开”); return; }
}
}
}
客户端:
import 。*;
import java。io.*;
import java。awt。*;
import java。awt。event。*;
import javax。swing。*;
public class Client extends Frame implements Runnable,ActionListener
{ DataInputStream in = null;
DataOutputStream out = null;
Panel p;
Label lab1,lab2,lab3;
TextField tf1,tf2,tf3;
Button connection,send;
Socket socket = null; Thread thread; TextArea text; public Client()
{ super("客户端:”);
setLayout(new FlowLayout());
setSize(300,250); //设置窗口大小
setLocation(200,200);//设置窗口显示位置
setResizable(false);
p=new Panel();
p。setLayout(null); p。setBounds(0,0,300,250);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{ System。exit(0); }
});
text = new TextArea();
lab1=new Label(”输入IP地址:”); lab1。setBounds(5,5,60,25);
lab2=new Label(”第一个数字:”); lab2。setBounds(5,35,60,25);
lab3=new Label(”第二个数字:”); lab3。setBounds(5,65,60,25);
tf1=new TextField(10); tf1。setBounds(80,5,100,25);
tf2=new TextField(10); tf2。setBounds(80,35,100,25);
tf3=new TextField(10); tf3.setBounds(80,65,100,25); connection=new Button("连接服务器");
connection.setBounds(200,5,90,25);
connection。addActionListener(this);
send=new Button(”发送数据”);
send。setBounds(200,65,90,25);
send。addActionListener(this);
text=new TextArea(200,50);
text.setBounds(5,100,290,110);
p。add(lab1); p.add(lab2); p.add(lab3);
p.add(tf1); p。add(tf2); p。add(tf3);
p。add(connection); p。add(send);
p.add(text); add(p);
setVisible(true);
socket=new Socket();
thread = new Thread(this);
}
public void actionPerformed(ActionEvent e)
{ if(e。getSource()==connection)
{
InetAddress address=null;
InetSocketAddress socketAddress=null;
try //请求和服务器建立套接字连接:
{
if(socket.isConnected()) {}
else
{ address=InetAddress.getByName(tf1.getText());
socketAddress=new InetSocketAddress(address,8755);
socket。connect(socketAddress,2000);//*等待2秒中
in =new DataInputStream(socket。getInputStream());
out = new DataOutputStream(socket.getOutputStream()); send.setEnabled(true);
JOptionPane.showMessageDialog(this,"连接成功!”,
”成功!”,JOptionPane。INFORMATION_MESSAGE);
thread.start();
} }
catch(IOException ex)
{ System.out。println("time out”+ex);
System.out。println(socketAddress.getHostName()+”:”+socketAddress.getPort());JOptionPane.showMessageDialog(this,”连接超时!”,”错误!",JOptionPane。ERROR_MESSAGE);
new Client();
dispose();
}
}
if(e。getSource()==send)
{ String s=tf2。getText()+","+tf3。getText();
if(s!=null)
{ try
{ out。writeUTF(s); }
catch(IOException e1){}
}
}
}
public void run()
{ String s=null;
while(true)
{
try
{ s=in。readUTF();
text。append(s+"\n");
}
catch(IOException e)
{ text.append(”与服务器已断开"); break; }
}
}
public static void main(String args[])
{ new Client(); }
}
四、 测试数据与实验结果
服务器:
客户端:
五、 结果分析与实验体会
通过这次实验,进一步了解了套接字一些用法,并且巩固了传输层与套接字的基本知识;以前对套接字不是很熟悉,经过这次实验,明白了套接字在网络编程中有着重要的角色,比如我们使用的聊天工具就是利用套接字来实现的.
六、思考题
六、 Java语言中,服务器端和客户端套接字对象类相同吗?如不同,有何差别?
答:不相同.客户端的程序使用Socket类建立到服务器的套接字连接,而服务器使用ServerSocket对象等待接收客户的信息。
七、 程序编写完毕并编译后,先运行客户端程序,还是先运行服务器端程序?为什么?
答:先运行服务器端程序.因为服务器端需要一直监听服务器端是否有请求。
八、 Java语言中如何使用UDP协议进行数据传输的?
答:java里UDP协议传送的方式细节已经封装了到类DatagramSocket里了,只要用DatagramSocket的对象进行传输数据就可以了。
展开阅读全文