`
cwd306972384
  • 浏览: 34429 次
  • 性别: 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  
下一步准备把客户端发送改为多线程发送,并采用线程池的方式,希望各位多提提意见。

相关推荐

    socket thread操作

    socket thread操作 socket thread操作 socket thread操作 自己还没看哦

    SocketThread实例.txt

    SocketThread实例(SocketThread实例.txt)

    socket服务器接收数据

    socket 接收多个终端上传的数据 ,每个终端新建一个socket,超时的socket定时清理,防止连接过多影响服务器性能

    Socket Programming & Thread Pool实例

    Socket Programming & Thread Pool实例

    java Swing+Socket+Thread聊天程序

    用javaSwing+Socket+Thread实现的群聊程序,分为服务器和客户端,没用到数据库

    Socket与Thread扫描端口

    Socket与Thread扫描端口,简单代码,初级运用,初学者。

    java Socket Thread IO 大文件下载上传整合

    这是一个java Socket Thread Io 大文件下载上传的整合

    Socket简单通讯

    Socket简单通讯 //声明将要用到的类 private IPEndPoint ServerInfo;//存放服务器的IP和端口信息 private Socket ServerSocket;//服务端运行的SOCKET private Thread ServerThread;//服务端运行的线程 private...

    multi_thread_socket_filetrans

    提供了许多线程间通信的实例程序。用linux下的C语言实现。-Provides many examples of thread communication procedures. Under linux using C language.

    socket通讯

    socket通讯,支持多线程通讯Socket communication, multi-threaded TCPIP communication, heartbeat maintenance, automatic reconnection, thread number configuration, etc. 报错 双语对照 Socket ...

    Python Socket传输文件示例

    import socket,time,SocketServer,struct,os,thread\nhost='192.168.50.74' port=12307 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #定义socket类型 s.bind((host,port)) #绑定需要监听的I

    JAVA实现SOCKET聊天

    protected Socket socket; protected ObjectInputStream dataIn; protected ObjectOutputStream dataOut; protected Thread listener; protected static Vector handlers = new Vector(); private boolean ...

    python聊天室---pyqt5+socket+Thread聊天室

    PyQt5结合Socket聊天室功能开发,项目中使用线程进行不同任务处理,是学习Scoket及线程非常好的案例。

    socket_send_buf_thread.zip

    这个是socket网络发送线程。使用这个线程,可以并行运行。有效的减小了时间,提高了发送的速率。

    socket多线程thread通讯.rar

    socket多线程thread通讯.rar

    Java多线程-Socket编程

    在 Java 中,多线程可以使用 Thread 类和 Runnable 接口来实现,而 Socket 编程则需要使用 java.net 包中的相关类来实现。 在 Java 多线程-Socket 编程中,客户端和服务器端都需要使用 Socket 来进行通信。客户端...

    Java Socket 编程源代码示例

    Socket socket = accept(); while (true) { new ServerReaderThread(socket); new ServerWriterThread(socket); } } finally { close(); } } public static void main(String[] args) ...

    Full Multi-thread Client_Server Socket Class with ThreadPoolSocketPort_Linux.zip

    Full Multi-thread Client_Server Socket Class with ThreadPoolSocketPort_Linux.zip

    Android 通过Socket 和服务器通讯

    Android 通过Socket 和服务器通讯,是一...(4)构建 SocketThreadManager对以上三个thread进行管理 (5)构建 TCPClient 发送socket消息 在NIO的方式实现TCP,特别是在接收服务器的数据,不用写个线程定时去读了。

    thread thread thread thread

    thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread thread ...

Global site tag (gtag.js) - Google Analytics