代码只兼容JAVA 7及以上版本。

服务器端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package com.stevex.app.bio;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import javax.net.ServerSocketFactory;
public class XiaoNa {
    public static void main(String[] args){
        XiaoNa xiaona = new XiaoNa();
         
        ServerSocket serverSocket = null;
        Socket socket = null;
        try {
            //可以设置客户连接请求队列的长度,比如5,队列长度超过5后拒绝连接请求
            //serverSocket = ServerSocketFactory.getDefault().createServerSocket(8383, 5);      
            serverSocket = ServerSocketFactory.getDefault().createServerSocket(8383);
             
            while(true){
                try{
                    //监听直到接受连接后返回一个新Socket对象
                    socket = serverSocket.accept();//阻塞
                    //new一个线程处理连接请求
                    new Thread(xiaona.new Worker(socket)).start();;
                }
                catch (Throwable e) {    //防止发生异常搞死服务器          
                    e.printStackTrace();
                }              
            }          
        catch (IOException e) {              
            e.printStackTrace();
        }
        finally{               
            try {             
                if(socket != null){
                    socket.close();
                }
            catch (IOException e) {
                e.printStackTrace();
            }  
        }
    }
     
    private static String getAnswer(String question){
        String answer = null;
         
        switch(question){
        case "who":
            answer = "我是小娜";
            break;
        case "what":
            answer = "我是来帮你解闷的";
            break;
        case "where":
            answer = "我来自外太空";
            break;
        default:
                answer = "请输入 who, 或者what, 或者where";
        }
         
        return answer;
    }
     
    private class Worker implements Runnable{
        private Socket socket;
         
        public Worker(Socket socket){
            this.socket = socket;
        }
         
        @Override
        public void run() {
            BufferedReader reader = null;
            PrintWriter writer = null;
             
            try {
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             
                writer = new PrintWriter(socket.getOutputStream());
                 
                String question = reader.readLine();//没有内容会阻塞
                 
                while(!question.equals("OVER")){
                    String answer = getAnswer(question);
                    writer.println(answer);
                    question = reader.readLine();
                }
                 
                writer.println("OVER");//OVER作为操作完成暗号
                writer.flush();
                 
                if(writer != null){
                    writer.close();
                }
                                     
                if(reader != null){
                    reader.close();
                }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
         
    }
}

客户端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package com.stevex.app.bio;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
    public static void main(String[] args) {
        Client c = new Client();
         
        //种20个线程发起Socket客户端连接请求
        for(int i=0; i<20; i++){
            new Thread(c.new Worker()).start();
        }      
    }
     
    private class Worker implements Runnable{
        @Override
        public void run() {
            Socket socket = null;
            BufferedReader reader = null;
            PrintWriter writer = null;
            try {
                //创建一个Socket并连接到指定的目标服务器
                socket = new Socket("localhost"8383);
                reader = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                writer = new PrintWriter(socket.getOutputStream());
                writer.println("who");
                writer.println("what");
                writer.println("where");
                writer.println("OVER");//OVER作为操作完成暗号
                writer.flush();
                String answer = reader.readLine();   //没有内容会阻塞      
                while(! answer.equals("OVER")){               
                    System.out.println(Thread.currentThread().getId() + "---Message from server:" + answer);
                    answer = reader.readLine();
                }
            catch (IOException e) {
                e.printStackTrace();
            finally {
                try {
                    if (writer != null) {
                        writer.close();
                    }
                    if (reader != null) {
                        reader.close();
                    }
                    if (socket != null) {
                        socket.close();
                    }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
         
    }
}

     本文转自sarchitect 51CTO博客,原文链接:http://blog.51cto.com/stevex/1581093,如需转载请自行联系原作者

JAVA BIO 服务器与客户端实现示例相关推荐

  1. bio java 例子_JAVA BIO 服务器与客户端实现示例

    代码只兼容JAVA 7及以上版本. 服务器端代码:package com.stevex.app.bio; import java.io.BufferedReader; import java.io.I ...

  2. Java实现服务器和客户端简单通信

    Java中网络编程这一块有封装的类库,使用简单,了解原理可以教容易实现服务器和客户端的简单通信. 在编程之前,首先要需要对TCP/IP协议有一定的了解,需要知道Socket套接字的作用以及用法,这个可 ...

  3. java 函数式编程 示例_Java套接字编程–套接字服务器,客户端示例

    java 函数式编程 示例 Welcome to Java Socket programming example. Every server is a program that runs on a s ...

  4. 【Java 网络编程】TCP 数据传输示例 ( 客户端参数设置 | 服务器端参数设置 | ByteBuffer 存放读取数据类型 )

    文章目录 I 客户端代码示例 II 服务器端代码示例 III 运行结果 I 客户端代码示例 import java.io.IOException; import java.io.InputStream ...

  5. 【Java 网络编程】UDP 服务器 与 客户端持续交互 案例

    文章目录 I UDP 交互原理 II UDP 服务器端代码示例 III UDP 客户端代码示例 IV 服务器 客户端 运行结果 I UDP 交互原理 1. UDP 单播传输流程 : A 给 B 发送数 ...

  6. 【Java 网络编程】TCP 服务器端 客户端 简单示例

    文章目录 I IntelliJ IDEA 创建 Java 项目 II 客户端 Socket 创建 III Socket 客户端连接服务器端 IV Socket 两个端点信息获取 V 控制台人机交互 V ...

  7. java怎么上传文件到web服务器_Java客户端通过Http发送POST请求上传文件到web服务器...

    http://www.cnblogs.com/WilliamJiang/archive/2012/04/29/2475883.html 1.朋友的一个需求,让我给他实现,需求是这样的,需要用ASP.n ...

  8. 实现服务器和客户端数据交互,Java Socket有妙招

    摘要:在Java SDK中,对于Socket原生提供了支持,它分为ServerSocket和Socket. 本文分享自华为云社区<Java Socket 如何实现服务器和客户端数据交互>, ...

  9. java socket 编程 客户机服务器_Java Socket编程服务器响应客户端实例代码

    通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; imp ...

最新文章

  1. 网站用户登录验证:Servlet+JSP VS Struts书剑恩仇录
  2. C#基础知识(个人笔记)
  3. Django——WEB三层架构与MVC
  4. oracle服务器不识别tc服务,记一次ORACLE无法启动登陆事故
  5. 【渝粤教育】国家开放大学2019年春季 3896人文英语1 参考试题
  6. [js] axios拦截器原理是什么?
  7. 【转】阿里技术专家详解DDD系列 第二讲 - 应用架构
  8. 关于网站注册账号时提示Server 对象 错误 'ASP 0177 : 800401f3'
  9. 编码神器 Sublime Text 包管理工具及扩展大全
  10. Linux Sed简介
  11. 哪些大学有计算机动漫专业,计算机专业考研有哪些值得推荐的院校?
  12. D-Bus 性能分析
  13. 地统计学插值 | IDW(反距离)和Kriging(克里金)
  14. CorelDRAWX4的VBA插件开发(九)循环的套用和统一尺寸
  15. GPS 原始坐标 (WGS-84) ddmm.mmmm 格式转高德(GCJ)百度(BD09)坐标
  16. 微信新功能,最牛的不是“斗图”!
  17. 传说之下手机如何使用debug_传说之下手机版怎么设置按键 按键设置方法
  18. 安卓 获取rtsp流 截屏_安卓星雨视频+星火电视盒子版+安卓文件闪传+安卓截屏大师...
  19. Cadence Allegro使用过程中出现的常见问题-原理图和PCB
  20. 将xlsx内容转成json

热门文章

  1. flex java 全局拦截_flex + java 过滤敏感词
  2. python configuration is still_通过Python配置关闭Release优化
  3. grep 与条件_小白贴:使用 grep 命令搜索多个字符串
  4. 12C OCP IZO-62 题库(8月以前)
  5. 如何通过 macOS 恢复功能重新安装 macOS
  6. java hashtable排序_java中哈希表中有迭代器模式的实现,可以认为其是顺序表吗?...
  7. linux里c库和gnu c库,Linux下的C的库文件和头文件有什么区别-
  8. java关闭inputstream_关闭Java InputStreams
  9. java core日志在哪里_java-如何在未启用日志记录功能的情况下在...
  10. 局域网中架设Win 2003终端服务器