当前位置:  技术问答>java相关

请问哪里有用java实现winsock的资料下载?

    来源: 互联网  发布时间:2014-12-27

    本文导语:  希望是免费的。 | 仅用一个类的TCP/IP服务器  作者:Greg Travis  来源:ZDNet    仅用一个类的服务器  作者: Greg Travis  日期: 2000年09月04日  <让我们通过一个Java程序的例子,学习建立...

希望是免费的。

|
仅用一个类的TCP/IP服务器 

作者:Greg Travis  来源:ZDNet 

  仅用一个类的服务器 
作者: Greg Travis 
日期: 2000年09月04日 


<让我们通过一个Java程序的例子,学习建立一个简单的TCP/IP服务器。大部分代码都放在一个类中,这样就很容易入门-> 

本文介绍了快速实现一个简单的TCP/IP服务器的技巧。核心代码都在单个类Server.java中,所以很容易建立和使用。 

Server.java的结构很简单。它监听一个端口,对于每一个进来的连接,生成处理该连接的线程。实际处理该连接的子程序并没有实现,所以你必须自己扩展Server.java,写个子程序来实现。 

(这样,从技术上讲,这就不是“仅用一个类的服务器”,因为你还需要用另外一个类,来完成某件事情。如果你真的坚持打算只用一个类,只需把子类中的代码放到Server.java中。) 

下面的EchoServer.java的代码体现了该程序的简单性。EchoServer 完成如下的简单功能:把客户发来的信息再发回去。 

----------------------------------------------- 
The One Class Server 
----------------------------------------------- 
EchoServer.java 
----------------------------------------------- 
----------------------------------------------- 
import java.io.*; 
import java.io.*; 

public class EchoServer extends Server 

// A single argument: the port on which to listen 
public EchoServer( int port ) { 
super( port ); 


// This function is called for each new connection; it 
// implements whatever functionality is needed from the server. 
// In this case, it simply sends back to the client all data 
// that the client sends it. If it receives a 'q', the 
// whole server is shut down. 

public void process( InputStream in, OutputStream out ) { 
try { 
while (true) { 
int c = in.read(); 
if (c=='q') { 
close(); 
} else { 
out.write( c ); 


} catch( IOException ie ) { System.out.println( ie ); } 


// Command-line: "java EchoServer <port>" 
static public void main( String args[] ) throws Exception { 
int port = new Integer( args[0] ).intValue(); 
new EchoServer( port ); 




Server类的实现是很有趣的,因为它对于所有线程使用了一个Server类的实例。 

Listener 线程 
创建的第一个线程是“listener”线程。该线程中的代码对一个端口进行监听,等待进入的连接。一旦一个连接进入时,一个新的“connection”线程被创建,用于处理该连接。 

Listener线程必须把用某种方法把新连接的Socket对象传送给新线程。因为Java在创建线程时,不具有传递参数的功能,所以使用了另外一个技术:哈希表。 

一个哈希表对象可以把线程对象映射为Socket对象。listener 线程创建了一个新的线程,然后把该新线程和新的socket放到哈希表中。当新线程开始执行时,它从哈希表基于自己的线程对象中,通过调用Thread.currentThread(),读入socket。 

对于Listener线程来说,因为它不需要其他线程“传递”什么信息,此时的哈希表中就没有Socket对象,这样,程序就可以判断这是一个listener 线程而不是一个connection线程。 

下面为Listener线程的代码。现在的这个实现很简单,因为它省略了一些处理。尤其是发生例外时的处理,我没有编写这些代码。因为这需要做更多的工作,而且依赖于具体的应用。 

----------------------------------------------- 
The One Class Server 
----------------------------------------------- 
The Listener Thread 
----------------------------------------------- 
----------------------------------------------- 
import java.io.*; 
import java.net.*; 
import java.util.*; 

abstract public class Server implements Runnable 

// The port the server will listen on 
private int port; 

// Used to "pass" a Socket to the new thread that will process it 

private Hashtable handoff = new Hashtable(); 

// The first thread -- we store it here so we can kill it 
// first when closing. 

private Thread listener; 

// A list of the Threads that have been started 

private Vector threads = new Vector(); 
// A list of the Sockets that have connected to us 

private Vector sockets = new Vector(); 

// The listen socket 
private ServerSocket ss; 
public Server( int port ) { 
this.port = port; 
// Start the listener thread. Because we haven't passed a Socket 
// object to this thread in the handoff table, it will know 
// that it is to be the listener thread. 
listener = new Thread( this ); 
listener.start(); 

synchronized public void close() { 
// First, make sure there aren't any incoming connections 
listener.stop(); 

// Now, close all the sockets 
for (Enumeration e = sockets.elements(); e.hasMoreElements();){ 
Socket s = (Socket)e.nextElement(); 
try { 
s.close(); 
} catch( IOException ie ) { System.out.println( ie );} 


// And stop all the threads 

for (Enumeration e = threads.elements(); e.hasMoreElements();){ 
Thread t = (Thread)e.nextElement(); 

// But let's not stop *ourselves* yet! 
if (t != Thread.currentThread()) 
t.stop(); 

System.out.println( "Shutting down!" ); 

// Now we can stop ourselves. 
Thread.currentThread().stop(); 


// This routine does the actual work of the server. It's not 
// implemented, so you have to extend this class to actually get 
// something done. 

abstract public void process( InputStream in, OutputStream out ); 

// This routine processes all the connections. All the threads 
// started by this class run this same routine of the same instance 
// of Server. 

public void run() { 
// Get the Socket that is being "passed" to us by the listener 
// thread. If there is no Socket here for us, then we ARE the 
// listener thread, or at least we are about to be. 

Socket s = (Socket)handoff.get( Thread.currentThread() ); 

if (s==null) { 
// Aha -- we are the very first thread, the listener thread. 
// Start listening. 
try { 
// Set up the listen socket. 
ss = new ServerSocket( port ); 
System.out.println( "Listening on "+port ); 

while (true) { 
// Accept a new connection 
s = ss.accept(); 
synchronized( this ) { 
System.out.println( "Connection from "+s.getInetAddress() ); 

// Make a new thread to handle this connection 
Thread t = new Thread( this ); 

// Store the thread and socket in the lists 
sockets.addElement( s ); 
threads.addElement( t ); 

// The Socket object is "passed" to the new thread by 
// getting stuffed here. When the new thread is started, 
// it will pull the Socket object out of here based on 
// its own Thread object. 

handoff.put( t, s ); 

// All set! Start the thread! 
t.start(); 


} catch( IOException ie ) {} 
} else { 
// We are a processing socket. 
try { 
InputStream in = s.getInputStream(); 
OutputStream out = s.getOutputStream(); 
// Call the actually-do-something routine in the subclass of 
// this object, so that something can actually get done. 
process( in, out ); 
} catch( IOException ie ) { System.out.println( ie ); } 






此处,我们也没有对socket,线程列表以及对handoff哈希表进行整理,大家可以修改这个类,以便能够完善这些工作,我把它们的代码编写工作作为练习,留给读者。

    
 
 

您可能感兴趣的文章:

  • 请问:请问哪里有关于linux基本操作命令讲解的资料下载,最好是幻灯片格式的.
  • 请问那理由Java安全方面的资料下载,多谢!送分!
  • 我想学习linux,请问哪个linux版本适合新手学习,哪里有相关资料下载,谢谢了
  • ☆请问各路大虾,哪里有 EJB 的学习资料下载?☆
  • 请问在B Shell中如何表示以下关系:a=0 or 0<a<7啊?a=0 and a=11?哪里有Shell编程的详细资料下载啊?
  • 请问,system.map有用吗?
  • 请问红旗Linux的认证有用吗
  • 请问哪里有用gtk做的程序,并包含源代码下载?
  • 请问这里有用thinkpad e420装LINUX的么?
  • 请问哪里有用JSP做的文件下载的应用程序。急!急!急!急!
  • 请问重新编译LINUX内核是否能将没有用的外设的驱动程序删除并减少内核占有内存的资源?请好心人仕指教!
  • 请问EJB高手,EJB主要用在b/s方式还是c/s,还是两这都可?有用过jBoss的吗?有配置文档吗?一定给分!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问:我知道路由器的telnet密码,但忘记了enable 密码,请问如何是好?
  • 请问那里有SYBASE的jbdb 2.0下载;jspsmartupload可以直接将文件上传到数据库,请问如何使用
  • 请问最新的reahat9.0是基于什么核心的?2.4?2.6?请问那里能下载?
  • 请问,我试图用#admintool&图形工具命令来安装sun workshop5.0,为什么进入的却是用户管理界面?请问具体该如何在solaris下安装应用软件
  • 请问在Redhat 9里,我从登录就是图形介面,请问如何在图形介面内进入命令行方式呢,谢谢
  • 请问玩过SOLARIS的高手门,在不正常关机后,就不能启动到windows公用桌面了,只能在命令提示模式下了,请问怎么解决这个问题啊?急~!~!
  • 请问:我在redhat下装了bochs-2.2.1-1.rpm,.装了后,想设置一下,但找不到bochsrc.fda.bxrc,请问这个文件在哪个曰录下啊。
  • 请问:在配置Qt时,很多文档都说在.profile,.login里加东西,但是我好像没有发现有这两个文件上,请问这些文件在哪个目录下啊
  • 请问:在GCC里的C程序里的变量的声明是不是只能在前面,而且相同类型的变量的声明只能放在一起?如果不是,请问怎么样可以解决这个问题.
  • 请问各位大虾,小弟今天开始学jsp了,这学期我们有java课,所以已经下载了jdk(好象是1.2),请问我的98环境怎么配置jsp环境呀?我的jdk可以运行.java程序,别的我就不知道了....谢谢!
  • 主机是WIN2000,我用的是LUNIX,请问是否可以共享上网? 如果可以请问如何设置? 500分答谢,龟儿食言!
  • 请问linux下GUI开发的问题!
  • 论坛 iis7站长之家
  • 请问这个方法如何调用?
  • 请问一个奇怪的问题!
  • 请问在网页中打开的新窗口,如何让其居中。
  • 请问我该学什么了
  • 请问安装zhcon,cxterm问题
  • 非常急! 请问daemontools 在red hat 9下的安装问题? 在线等待
  • 请问如何在一台单机上装VMware的网络访问问题?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3