java搭建一个Socket服务器响应多用户访问

时间:2022-04-14 05:41:42

当我们搭建了一个Socket服务端,是需要去响应多用户的访问的。此时,我们就要使用多线程,为每个访问的用户建立一个线程来响应该用户的访问。

具体实现,看如下代码:

java" id="highlighter_340629">
?
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package com.sun.socket;
import Java.io.IOException;
import java.NET.*;
import java.io.*;
import java.util.*;
 
/**
* Description:
* 搭建一个Socket服务器响应多用户访问
* @author Lee
* */
public class ServerSocketDemo {
ArrayList MSG = new ArrayList<>();
ArrayList RES = new ArrayList<>();
 
/**
 * Description:
 * 初始化数据
 * */
public void init(){
  MSG.add("hellow");
  RES.add("hi");
}
 
/**
 * Description:
 * 搭建一个Socket服务器响应多个用户访问
 * */
public void test1(){
  init();
  ServerSocket server = null;
 
  try{
    //以指定端口搭建一个Socket服务端
    server = new ServerSocket(12000); 
 
    //等待客户端Socket实例,并创建一个线程去响应该客户单实例
    while(true){
      new Response(server.accept()).start();;
    }
 
  }catch(IOException e){
    e.printStackTrace();
  }finally{
    try{
      server.close();
    }catch(IOException e){
      e.printStackTrace();
    }
 
  }
}
 
/**
 * Description:
 * 根据用户输入的内容,返回相应的内容
 *
 * @param msg 客户端输入的内容
 * @return 返回服务端回复的内容
 * */
public String getMsg(String msg){
  String res = "Are you kidding me?Please speak English.";
 
  for(int i=1;i<MSG.size();i++){
    if(msg.contains(MSG.get(i))){
      res = RES.get(i);
    }
  }
 
  return res;
}
 
 
public static void main(String[] args) {
  // TODO Auto-generated method stub
  new ServerSocketDemo().test1();
}
 
/**
 * Description:
 * 响应用户
 * @author Lee
 * */
class Response extends Thread{
  Socket client;
 
  /**
   * Description:
   * 默认构造器
   * */
  public Response(){}
  /**
   * Description:
   * 初始化Socket
   * */
  public Response(Socket client){
    this.client = client;
  }
 
  @Override
  public void run(){
    Scanner input = null;
    PrintWriter output = null;
 
    try{
      //获取用户端的输入和输出流
      input = new Scanner(client.getInputStream());
      output = new PrintWriter(client.getOutputStream());
 
      output.println("欢迎访问!");
      output.flush();
 
      //等待客户端的输入
      String content = null;
      while(input.hasNext()){
        content = input.nextLine();
 
        //根据用户端的输入,做出相应的反应
        if(content.equalsIgnoreCase("quit")){
          break;
        }else{
          output.println(getMsg(content));
          output.flush();
        }
      }
 
    }catch(IOException e){
      e.printStackTrace();
    }finally{
      //关闭资源
      input.close();
      output.close();
    }
 
 
  }
}
}

1、我们可以写一个小小测试工具类,来测试一下public String getMsg(String msg)方法。

对该类右键,选择new新建一个JUnit Test Case 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.sun.socket;
import org.junit.Assert;
import org.junit.Test;
public class ServerSocketDemoTest {
  @Test
  public void testGetMsg() {
    try{
      //调用该方法,并与其目标值进行对比。
      String msg = new ServerSocketDemo().getMsg("在吗");
      Assert.assertEquals("gun!", msg);
 
    }catch(Exception e){
      e.printStackTrace();
    }
  }
 
}

2、使用apche JMeter工具对该服务端进行压力测试

(1)打开Apache JMeter,右键测试计划->添加->Threads(Users)->Setup Thread Group

java搭建一个Socket服务器响应多用户访问

(2)设置线程属性(线程数,循环次等)

java搭建一个Socket服务器响应多用户访问

(3)右键添加->simpler->HTTP请求

java搭建一个Socket服务器响应多用户访问

(4)设置属性,点击运行就可以进行压力测试了。

java搭建一个Socket服务器响应多用户访问

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/qq1131410679/article/details/55051195