博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA BIO 服务器与客户端实现示例
阅读量:5989 次
发布时间:2019-06-20

本文共 3893 字,大约阅读时间需要 12 分钟。

代码只兼容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
,如需转载请自行联系原作者
你可能感兴趣的文章
制作Windows XP万能克隆镜像
查看>>
WebStorm: The Smartest JavaScript IDE by JetBrains
查看>>
炮灰模型——女生选择追求者模型
查看>>
C# System.IO.FileStream 文件正由另一进程使用,因此该进程无法访问该文件
查看>>
解决vim粘贴时格式混乱的问题
查看>>
vue-cli3 项目从搭建优化到docker部署
查看>>
95. Unique Binary Search Trees II
查看>>
前后分离的总结
查看>>
TIOBE 2 月排行榜:时隔 3 年,Groovy 重进 TOP 20
查看>>
Distributed Systems-一致性协议背景介绍及Paxos算法的推导
查看>>
Python Logging库HTTPHandler的消息格式化的方法
查看>>
Python基础教程:Day15-图像和办公文档处理
查看>>
Bytom设计结构解读
查看>>
java实现FTP多线程断点续传,上传下载
查看>>
突破瓶颈,对比学习:Eclipse开发环境与VS开发环境的调试对比
查看>>
同步与异步&阻塞与非阻塞-各种解释
查看>>
Android中如何查看内存(上)
查看>>
Jersey2.x框架搭建简单的Restful API
查看>>
Hadoop的实现原理及基本使用方法
查看>>
Qt4.8.6编译mysql驱动-深入了解
查看>>