网络编程题目
⑴ JAVA 网路程序设计题目
1、请描述TCP/IP参考模型
应用层 提供各种服务进程
传输层 提供安全,可靠的端到端服务
网络互联层 整个参考模型的核心,提供把IP数据包发送到
目标主机的功能.
主机-网络层 只要求第三方实现的主机-网络层能够为上层(网
络互联层)提供一个访问接口,使得网络互联层能
利用主机-网络层来传递IP数据包
3、请列举常用的传输层协议和应用层协议
传输层:UDP,TCP
应用层:HTTP,FTP,TELNET,SNMP,DNS
4、请描述非阻塞通信的流程及所涉及的主要java类和类职责。
• 处理流程 (PPT第四章第十页)
1. While(循环条件){//阻塞
2. If(有客户连接)
3. 接收客户连接;//非阻塞
4. If(Socket输入流有可读数据)
5. 从输入流中读数据; //非阻塞
6. If(Socket输出流可写数据)
7. 向输出流中写数据; //非阻塞
主要JAVA类和类职责:
主要的类:
Socketchannel 支持阻塞和非阻塞通信,Socket的替代类
ServerSocketchannel 支持阻塞和非阻塞通信,ServerSocket的替代类
Selector 监控各种就绪事件
SelectionKey 代表ServerSocketchannel和Socketchannel向Selector注册事件的句柄
非主要的类:
SelectableChannel 一种支持阻塞I/O和非阻塞I/O的通道
Channel 连接缓冲区与数据源或数据汇(数据目的地)
Buffer 缓冲区,提高I/O的效率
Charset 每个实例代表特定的字符编码类型
5、请描述创建UDP通信的流程及所涉及的主要java类和类职责
流程:
主要JAVA类和类职责:
DatagramPacket类 表示数据报,即缓存接收和发送的数据
DatagramSocket类 用于接收和发送数据报
DatagramChannel类 作用类似于selector ,向selector注册就绪事件,只是支持非阻塞通信
6、请描述RMI规范对远程方法的参数及返回值的规定
1. 当客户端调用服务器端远程对象方法时,客户端会向服务器端传递参数,服务器端则会向客户端传递返回值。
2. Rmi规范对参数及返回值的传递作了规定:
只有基本类型的数据、远程对象及可序列化的对象才可以作为参数或返回值进行传递。
如果参数或者返回值是一个远程对象,那么它的存根对象传递到接收方,也就是说,接收方得到的是远程对象的存根对象。
如果参数或返回值是可序列化对象,那么直接传递该对象的序列化数据。也就是说,接收方得到的是发送方的可序列化对象的复制品。
如果参数或返回值是基本类型的数据,那么直接传递该数据的序列化数据,--复制品
7、请描述对象序列化与反序列化的作用,以及所涉及的主要java类。
作用:
• 把对象的字节序列永久的保存到硬盘上,通常存放在一个文件中.
• 在网络上传送对象的字节序列.
主要java类:
• 只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则ObjectOutputStream的writeObject(Object obj)方法会抛出IOException。
• 实现了Serializable或Externalizable接口的类也称为可序列化类。
• Externalizable接口继承Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为。而仅实现Serializable接口的类可以采用默认的序列化方式。
• Jdk的部分类 如String\Date等都实现了Serializable接口
8、请描述java语言的反射机制作用及所涉及的主要java类
Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
主要java类
Class类:代表一个类。
Field类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组元素的静态方法。
第二大题和第三大题有我上网找的图片格式的文件,已经发到你邮箱去了。
⑵ 关于c#的Socket异步网络编程问题
这样的写法有点问题:
1)服务器端既然采用了异步方式Accept,就没有必要再启线程
2)估计allDone是一个ManualResetEvent。用ManualResetEvent的目的什么呢?
服务器端采用异步Accept的代码其实很简单,也不需要ManualResetEvent同步
publicclassAppTCPServer
{
publicAppTCPServer(stringlocalIP,intport)
{
Socketsocket=newSocket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
EndPointlocalEP=newIPEndPoint(IPAddress.Parse(localIP),port);
socket.Bind(localEP);
socket.Listen(100);
socket.BeginAccept(AcceptAsync,socket);
}
privatevoidAcceptAsync(IAsyncResultar)
{
Socketsocket=ar.AsyncStateasSocket;
try
{
Socketclient=socket.EndAccept(ar);
Console.WriteLine("客户端连接成功!客户端:{0}",client.RemoteEndPoint.ToString());
if(OnConnected!=null)
{
OnConnected(this,newClientConnectedEventArgs(client));
}
}
catch(Exceptione)
{
Console.WriteLine("AcceptAsync发生异常,异常信息: {0}",e.Message);
}
finally
{
//继续异步Accept
socket.BeginAccept(AcceptAsync,socket);
}
}
//客户端连接后的事件OnConnect
publiceventEventHandler<ClientConnectedEventArgs>OnConnected;
}
///<summary>
///事件参数:接收客户端连接后的事件参数
///</summary>
:EventArgs
{
(SocketclientSocket)
{
ClientSocket=clientSocket;
}
publicSocketClientSocket{get;privateset;}
}
classProgram
{
staticvoidMain(string[]args)
{
AppTCPServerserver=newAppTCPServer("127.0.0.01",8000);
server.OnConnected+=server_OnConnected;
Console.WriteLine("按任意键结束程序……");
Console.ReadKey();
}
staticvoidserver_OnConnected(objectsender,ClientConnectedEventArgse)
{
Socketclient=e.ClientSocket;
stringhello="HellofromAppTCPServer";
client.Send(Encoding.Default.GetBytes(hello));
}
}
客户端测试程序
classProgram
{
staticvoidMain(string[]args)
{
//模拟100个客户连接服务器
for(inti=0;i<100;i++)
{
Socketsocket=ConnectToServer("127.0.0.1",8000);
byte[]buffer=newbyte[1024];
intbytesRecevied=socket.Receive(buffer,buffer.Length,SocketFlags.None);
byte[]messageBytes=newbyte[bytesRecevied];
Array.Copy(buffer,messageBytes,bytesRecevied);
Console.WriteLine(Encoding.Default.GetString(messageBytes));
socket.Disconnect(false);
socket.Close();
}
Console.ReadKey();staticSocketConnectToServer(stringserverIP,intserverPort)
{
Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
EndPointlocalEP=newIPEndPoint(IPAddress.Any,0);
socket.Bind(localEP);
socket.Connect(newIPEndPoint(IPAddress.Parse(serverIP),serverPort));
returnsocket;
}
}