网络程序设计.docx
《网络程序设计.docx》由会员分享,可在线阅读,更多相关《网络程序设计.docx(17页珍藏版)》请在冰豆网上搜索。
网络程序设计
第10章网络程序设计
【1】java提供了哪几种网络通信模式?
[解答]:
基于TCP/IP协议的面向连接的通信模式,基于UDP协议的面向无连接的通信模式。
【2】java的套接字网络通信方式分为哪几种?
[解答]:
基于TCP/IP协议:
客户端套接字,服务器端套接字。
基于UDP协议:
用户数据报套接字,广播数据报套接字。
【3】什么是socket,怎样建立socket连接?
建立连接时,客户端和服务器端有什么不同?
[解答]:
Socket就是套接字,是IP地址和端口号的组合。
当两个网络程序需要通信时,它们可以通过使用Socket类建立套接字连接。
服务器端建立Socket以后,要执行一个等待的方法,以方便客户端来连接。
客户端建立Socket以后即与服务器端进行连接,成功握手以后,双方产生同样的Socket对象。
【4】请列举常用的协议及其端口号。
[解答]:
ftp 21/tcp
telnet 23/tcp
smtp 25/tcp
http 80/tcp
pop3 110/tcp
snmp 161/udp
https 443/tcp
https 443/udp
pop3 110/tcp
【5】试描述用Socket建立连接的基本程序框架。
[解答]:
(1)客户端建立套接字对象,指定服务器IP和端口号。
(2)服务器端建立套接字,并指定端口号。
(3)服务器端监听本机的端口的状态:
执行accept()方法。
(4)客户端程序在对象产生以后以及,服务器端的程序监听到有连接以后都会产生一个Socket类的实例。
(5)对这两个实例中对应的输入流和输出流进行操作,即完成通信过程。
【6】说明客户端如何与服务器端进行连接。
[解答]:
TCP/IP的方式是:
客户端产生Socket对象的同时产生与对应端口号的服务器连接的动作。
UDP数据报的方式是:
客户端建立DatagramSocket对象,建立报文DatagramPacket对象,并指定发送的IP地址,调用socket对象的send方法进行连接并发送数据。
【7】说明客户端如何从服务器读一行文本。
[解答]:
TCP/IP的方式是:
客户端与服务器端成功握手以后,从Socket中得到数据输入流并用相应的包装器进行包装,以输入流中相应的read方法来读取一行的文本。
UDP数据报的方式是:
建立数据报的DatagramSocket对象以后,调用DatagramSocket对象的receive方法来等待服务器的数据到来,接收到数据以后用DatagramPacket对象的getData方法来将接收到的数据提取出来。
【8】说明服务器如何将数据发送到客户端。
[解答]:
TCP/IP的方式是:
客户端与服务器端成功握手以后,从Socket中得到数据输出流并用相应的包装器进行包装,用并向客户端调用相应的write方法来发送数据。
UDP数据报的方式是:
创建数据报文DatagramSocket对象,调用DatagramSocket对象的receive方法来等待客户端的请求到来。
从到来的DatagramPacket包中得到地址和端口号,建立数据报文对象,发送数据报。
【9】采用套接字的连接方式编写一个程序,允许客户向服务器提出一个名字,如果这个文件存在,就把文件内容发送给客户,否则回答文件不存在。
[解答]:
//客户端
importjava.awt.Button;
importjava.awt.FlowLayout;
importjava.awt.TextField;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.io.BufferedInputStream;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
import.Socket;
importjavax.swing.JFrame;
publicclassTranFileClientextendsJFrameimplementsActionListener{
Buttonbtn;
TextFieldtf;
publicTranFileClient(){
//布局
super("要接收的文件名");
setBounds(400,400,300,100);
setVisible(true);
btn=newButton("接收");
tf=newTextField(7);
setLayout(newFlowLayout());
add(tf);
add(btn);
btn.addActionListener(this);
validate();
addWindowListener(newWindowAdapter()
{publicvoidwindowClosing(WindowEvente)
{System.exit(0);}
});
}
publicstaticvoidmain(String[]args){
newTranFileClient();
}
/*(non-Javadoc)
*@seejava.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
publicvoidactionPerformed(ActionEventarg0){
try{
Socketst=newSocket("localhost",3997);
//给服务器文件名
DataOutputStreamoutServ=newDataOutputStream(st.getOutputStream());
outServ.writeUTF(tf.getText().trim());
//读服务器的消息
FileOutputStreamout=newFileOutputStream(tf.getText().trim());
InputStreamnetin=st.getInputStream();
InputStreamin=newDataInputStream(newBufferedInputStream(netin));
System.out.println("getingdata.....");
byte[]buf=newbyte[2048];
//
intnum=in.read(buf);
while(num!
=-1){
out.write(buf,0,num);
num=in.read(buf);
}
//取出服务器的状态
Stringstr=newString(buf);
if(TranFileServer.PROP.equals(str.trim())){
tf.setText("文件没有找到!
");
}
in.close();
out.close();
outServ.close();
System.out.println("recievedover.....");
}catch(IOExceptione){
e.printStackTrace();
}
}
}
服务器
import.ServerSocket;
import.Socket;
importjava.io.*;
publicclassTranFileServer{
//查找的文件的目录
finalstaticStringPATH="d:
/src";
finalstaticStringPROP="NO";
booleanisExist=false;
publicTranFileServer(){
init();
}
privatevoidinit(){
ServerSocketserver;
Socketst;
Strings=null;
try{
server=newServerSocket(3997);
System.out.println("waitingclientconnect");
st=server.accept();
//读客户端来的文件名
try{
DataInputStreamin=newDataInputStream(st.getInputStream());
while(true){
s=in.readUTF();
if(s!
=null)
break;
}
System.out.println(s);
}catch(IOExceptione){
System.out.println("ERRO:
"+e);
throwe;
}
doCheck(s);
if(isExist){
FileInputStreamfos=newFileInputStream(PATH+"/"+s);
OutputStreamnetout=st.getOutputStream();
DataOutputStreamdoc=newDataOutputStream(
newBufferedOutputStream(netout));
System.out.println("sendingdata....");
byte[]buf=newbyte[2048];
intnum=fos.read(buf);
while(num!
=-1){
doc.write(buf,0,num);
doc.flush();
num=fos.read(buf);
}
fos.close();
doc.close();
}else{
OutputStreamnetout=st.getOutputStream();
DataOutputStreamdoc=newDataOutputStream(
newBufferedOutputStream(netout));
doc.write(PROP.getBytes());
doc.close();
}
}catch(IOExceptione){
e.printStackTrace();
}
}
/**
*文件是否存在判断
*
*@params
*@return
*/
privatevoiddoCheck(Strings){
booleanisExist;
//文件是否存在
Filefile=newFile(PATH);
String[]filenames=file.list();
for(inti=0;iStringstr=filenames[i];
if(str.equals(s)){
this.isExist=true;
return;
}
}
}
publicstaticvoidmain(String[]args){
newTranFileServer();
}
}
【10】写出使用多线程使得一个服务器同时为多个客户程序服务的基本框架。
[解答]:
/**
*多客户端一个服务器的例子
*/
import.*;
importjava.io.*;
importjava.awt.*;
importjava.awt.event.*;
classC_clientextendsFrameimplementsActionListener{
TextAreatxt1;
Buttonbtn;
Panelp;
intport;
DataInputStreamin=null;//数据输入流
DataOutputStreamout=null;//数据输出流
Socketc_socket;//套接字
InputStreamin_data;//接收到的输入流
OutputStreamout_data;//发送的输出流
Stringstr;//存放接收的数据
inti=0;
C_client(){
super("客户端");
setSize(300,200);
setVisible(true);
txt1=newTextArea(5,4);
add(txt1,BorderLayout.CENTER);
p=newPanel();
add(p,BorderLayout.NORTH);
btn=newButton("连接");
p.add(btn);
btn.addActionListener(this);
validate();
}
publicstaticvoidmain(String[]args){
newC_client();
}
publicvoidactionPerformed(ActionEventeee){
try{
c_socket=newSocket("127.0.0.1",4321);
}catch(IOExceptione){
e.printStackTrace();
}
try{
in_data=c_socket.getInputStream();
out_data=c_socket.getOutputStream();
in=newDataInputStream(in_data);
out=newDataOutputStream(out_data);
intp1=c_socket.getPort();
intp2=c_socket.getLocalPort();
txt1.append("获取到对方的端口号:
"+p1+"\n");
txt1.append("本机的端口号:
"+p2+"\n");
}catch(IOExceptione){
e.printStackTrace();
}
try{
str=in.readUTF();
txt1.append("客户收到:
"+str+"\n");
if(i>10){
out.writeUTF("end");
c_socket.close();
System.exit(0);
}//发出end信息
else{
out.writeUTF("IamClient");
i++;
}
}catch(IOExceptione){
System.out.println("ddd");
}
}
}
/**
*多客户端一个服务器的例子
*/
import.*;importjava.io.*;
importjava.awt.*;importjava.awt.event.*;
classS_serverextendsFrameimplementsActionListener,Runnable
{
ServerSockets_socket;//服务器端套接字
Socketc_socket;//套接字
DataInputStreamin=null;//数据输入流
DataOutputStreamout=null;//数据输出流
InputStreamin_data;//接收到的输入流
OutputStreamout_data;//发送的输出流
inti=0;//计数(连接的客户数)
Stringstr;
TextAreatxt1;
Buttonbtn;
Panelp;
S_server()
{
super("server");
setSize(300,200);
setVisible(true);
txt1=newTextArea(5,4);
add(txt1,BorderLayout.CENTER);
p=newPanel();
add(p,BorderLayout.NORTH);
btn=newButton("开始监听端口");
p.add(btn);
validate();
btn.addActionListener(this);
}
publicvoidactionPerformed(ActionEventeee)
{
try{
s_socket=newServerSocket(4321);
while(true)
{
c_socket=s_socket.accept();
Threadt=newThread(this);
t.start();
i++;
}
}catch(IOExceptione){}
}
//线程
publicvoidrun()
{
try{
while(true)
{
in_data=c_socket.getInputStream();
out_data=c_socket.getOutputStream();
in=newDataInputStream(in_data);
out=newDataOutputStream(out_data);
out.writeUTF("Hello,我是服务器");
str=in.readUTF();
if(str.equals("end"))
{//接收到end信息,则断开连接
in.close();
out.close();
c_socket.close();
}
txt1.append("第"+i+"个客户发来:
"+str+"\n");
Thread.sleep(200);
}//while_end
}
catch(IOExceptione){
e.printStackTrace();
}
catch(Exceptionee){
ee.printStackTrace();
}//Thread_catch
}
publicstaticvoidmain(String[]args)
{
newS_server();
}
}
【11】写出一个客户同时有多个服务器为他提供服务的基本框架。
[解答]:
/**
*一个客户端多个服务器的例子
*/
import.*;
importjava.io.*;
importjava.awt.*;
importjava.awt.event.*;
classC_client1extendsFrameimplementsActionListener,Runnable{
TextAreatxt1;
Buttonbtn;
Panelp;
intport;
DataInputStreamin=null;//数据输入流
DataOutputStreamout=null;//数据输出流
//套接字
InputStreamin_data;//接收到的输入流
OutputStreamout_data;//发送的输出流
Stringstr;//存放接收的数据
String[]IP=newString[]{"127.0.0.1","127.0.0.2","127.0.0.3"};//服务器的IP
intIPi=0;//IP的下标
C_client1(){
super("客户端");
setSize(300,200);
setVisible(true);
txt1=newTextArea(5,4);
add(txt1,BorderLayout.CENTER);
p=newPanel();
add(p,BorderLayout.NORTH);
btn=newButton("连接");
p.add(btn);
btn.addActionListener(this);
validate();
}
publicstaticvoidmain(String[]args){
newC_client1();
}
publicvoidactionPerformed(ActionEventeee){
Threadt1=newThread(this);
t1.start();
Threadt2=newThread(this);
t1.start();
Threadt3=newThread(this);
t1.start();
}
publicvoidrun(){
Socketc_so