`
cwd306972384
  • 浏览: 35182 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Thread,Socket从头开始

    博客分类:
  • java
阅读更多
在网上看了很多关于Thread和Socket的资料,项目中也用到不少,但是都是比较简单,或者是用一些现成的,现在想从头开始,慢慢的再学习。希望能和各位前辈进行交流。接触的需求好多一开始比较简单,后来就慢慢复杂了,我想这个学的过程也是,先来个简单的,然后再慢慢的进行完善。好了,不废话了。
场景:客户端将键盘输入的字符通过socket发送到服务端,当输入的字符为“exit”时,程序退出,服务端仅仅将接收到的信息打印出来。
服务端代码:
   
public class SocketServer extends Thread{  
      
        private java.net.ServerSocket ss;  
        private java.net.Socket s;  
        @Override  
        public void run() {  
            try{  
                while(true){  
                    this.s=this.ss.accept();  
                    java.io.BufferedReader reader =  
                        new BufferedReader(  
                                new java.io.InputStreamReader(  
                                        s.getInputStream()));  
                    String str=reader.readLine();  
                    System.out.println("开始接受数据:");  
                    while(str!=null){  
                        System.out.println("读了一行");  
                        System.out.println(str);  
                        str=reader.readLine();  
                    }  
                    reader.close();  
                    this.s.close();  
                }  
            }catch(Exception ex){  
                ex.printStackTrace();  
            }  
        }  
        public SocketServer(int port){  
            try{  
                System.out.println("服务端启动.......");  
                this.ss=new ServerSocket(port);  
            }catch(Exception ex){  
                ex.printStackTrace();  
            }  
        }  
        public static void main(String[] args){  
            Thread t=new SocketServer(8888);  
            t.start();  
        }  
    }  

客户端的代码:
   
public class SocketClient{  
        public static void main(String[] args)throws Exception {  
            java.net.Socket s=new java.net.Socket("127.0.0.1",8888);  
            java.io.BufferedWriter out=new java.io.BufferedWriter(  
                    new java.io.OutputStreamWriter(  
                            new java.io.BufferedOutputStream(s.getOutputStream())));  
              
            java.io.BufferedReader reader=new BufferedReader(  
                    new java.io.InputStreamReader(System.in));  
              
            String str=reader.readLine();  
            while(!"exit".equals(str)){  
                out.write(str + "\n");  
                out.flush();  
                str=reader.readLine();  
            }  
            reader.close();  
            out.close();  
        }  
    }  
分享到:
评论
14 楼 hobitton 2010-12-16  
yqsshr 写道
发现楼主都是用这种形式创建流的,弱弱的问一句,这样会不会导致流没有关闭呢?
java.io.BufferedReader reader =     
                     new BufferedReader(     
                            [b]new java.io.InputStreamReader[/b](     
                                   s.getInputStream()));     

不会有问题的,外层的关闭了会把里面的一起关闭。
13 楼 lovexp2010 2010-12-16  
yqsshr 写道
例如上面[b][/b]直接的部分,只new出来了,但colse过吧。。我也不知道这样子会不会不好,呵呵



我认为可以关闭

因为下面有 reader.close() 而 BufferedReader 的close方法是这样实现的:
public void close() throws IOException {
	synchronized (lock) {
	    if (in == null)
		return;
	    in.close();
	    in = null;
	    cb = null;
	}
    }


你看,实际上还是调用了in的close方法,所以会调用到最里面的那个对象( new java.io.InputStreamReader) 的close方法

所以可以关闭掉,楼下继续!
12 楼 yqsshr 2010-12-15  
例如上面[b][/b]直接的部分,只new出来了,但colse过吧。。我也不知道这样子会不会不好,呵呵
11 楼 yqsshr 2010-12-15  
发现楼主都是用这种形式创建流的,弱弱的问一句,这样会不会导致流没有关闭呢?
java.io.BufferedReader reader =     
                     new BufferedReader(     
                            [b]new java.io.InputStreamReader[/b](     
                                   s.getInputStream()));     
10 楼 菜菜bruce 2010-12-15  
sample而已,实际项目中无法使用
9 楼 vieri122 2010-12-15  
cwd306972384 写道
下一步准备把客户端发送改为多线程发送,并采用线程池的方式,希望各位多提提意见。


用不用线程池到无所谓,希望楼主在多线程同步上给出精彩的代码。一直想知道在java上是如何实现多路分离,以及串行化操作的?

ps:由于被扣分,为了回这个贴,又做了一次论坛测试。
8 楼 shijiyu 2010-12-15  
nakupanda 写道
现在NIO和IO不是一回事吗?

NIO 是非阻塞IO操作 IO是阻塞的 NIO在效率上讲要比IO的高
7 楼 nakupanda 2010-12-14  
现在NIO和IO不是一回事吗?
6 楼 C_J 2010-12-14  
其实你应该写个NIO的,再配上多任务线程.. 算是现在效率比较好的
5 楼 lardern 2010-12-14  
关键是服务端,你服务端对请求的处理会阻塞其它客户端的请求,如果这个处理稍微耗时,多个客户端的情况下,问题就出来了
你下一步应该是改服务端,继续学习吧
4 楼 ch_space 2010-12-14  
狂汗。。。。。。。又在看书了吧,还是写在伯克利比较合适
3 楼 wwwlyxwww 2010-12-14  
用mina啊,虽然我也不怎么熟悉,但是不错
2 楼 sleepinglord 2010-12-14  
其实我有一特2的问题:
假如机器上装了8个网卡,用了16家ISP的网络服务,有没有程序能把这些透明化呢?就是好像我只有一个网卡,一家服务一样?
1 楼 cwd306972384 2010-12-13  
下一步准备把客户端发送改为多线程发送,并采用线程池的方式,希望各位多提提意见。

相关推荐

    xtrachat:从头开始构建的用 JAVA 制作的基本聊天服务器客户端,用于学习目的

    JAVA的Thread类和Runnable接口为我们提供了实现并发执行的工具,理解并熟练运用这些工具对于提升服务器性能至关重要。 文件名“xtrachat-master”可能表示这是一个项目的源代码仓库,包含主分支的全部代码。在实际...

    Java网络编程多线程断点下载带界面选择文件夹进度条

    4. **断点续传**:当下载中断时,系统会记住已下载的部分,下次启动下载时可以从已有的部分继续,而不是从头开始。这需要在服务器和客户端之间保存和传递文件的当前位置信息。 5. **文件I/O操作**:在Java中,`java...

    FileTransmit_FTP断点续传_Vc_sidesfof_

    断点续传技术是FTP传输的重要增强,它允许在传输过程中暂停,然后在稍后的时间点继续传输,而不必从头开始。这对于处理大文件或网络不稳定环境下的文件传输尤其有用。FileTransmit程序利用这一特性,确保了文件传输...

    基于Java的网络蚂蚁Java版.zip

    断点续传是另一个核心功能,它允许用户在下载过程中暂停,然后在任意时间点继续下载,而不必从头开始。这在大文件下载时尤其有用。在Java中,实现这一功能通常需要保存已下载部分的文件和相关信息,例如已下载的字节...

    java-lib

    在Java编程中,库(Library)是预先编写好的代码集合,程序员可以导入并直接使用,无需从头开始编写所有功能。这些库通常以JAR(Java Archive)文件的形式存在,里面封装了类和方法,可供应用程序调用。Java库广泛...

    java程序设计课件

    通过继承,子类可以扩展或修改父类的功能,而无需从头开始编写所有代码。在课件中,你将学习如何声明、实现和使用继承关系,以及理解super关键字和final关键字的应用。 "多线程"是Java的另一大亮点。在现代计算环境...

    duandianxuchuan.rar_传 文件_断点续传

    断点续传允许在文件传输过程中,如果因为网络中断或其他原因导致传输暂停,可以在稍后的时间重新从上次中断的位置继续传输,而无需从头开始。这种方式极大地提高了文件传输的效率和成功率,尤其是在网络条件不稳定的...

    相当全面的关于Java的类库

    Java 类库是Java编程语言的重要组成部分,它们提供了一系列预先编写好的功能,可以帮助开发者高效地实现各种功能,而无需从头开始编码。这个压缩包“JAVA类库大全”显然是一个资源丰富的集合,包含了学习和使用Java...

    Java_API中文完整版

    API提供了大量的类库和接口,帮助开发者实现各种功能而无需从头编写代码。Java API包括标准库和其他扩展库,如Java SE(Standard Edition)、Java EE(Enterprise Edition)和Java ME(Micro Edition)等。 ### ...

    studydemo

    "studydemo-master"这个文件名通常表示这是项目的主分支或者包含了所有主要功能的版本,意味着这个压缩包可能包含了完整的源代码、文档或者其他辅助材料,用于帮助学习者从头开始理解Java编程,并逐步掌握各种关键...

    java经典面试题(pdf)

    多线程是Java的一个强项,面试中可能会讨论到线程的创建方式(Thread类和Runnable接口)、线程同步(synchronized、Lock、volatile)、线程通信(wait/notify、CountDownLatch、CyclicBarrier、Semaphore)以及...

    Java基础知识的详细总结

    这些库使得开发人员可以快速构建复杂的应用程序而无需从头编写所有代码。 - **标准库概览**: - `java.lang`包包含了运行Java程序所必需的基本类,如`String`、`Object`和`Thread`等。 - `java.awt`包提供了创建...

Global site tag (gtag.js) - Google Analytics