本讲内容: socket 只会装傻的”智能“机器人
套接字(socket)是代表计算机之间网络连接的对象。要进行计算机间的网络通讯,建立TCP连接,那么就需要Socket编程,Java提供了ServerSocket类和Socket类,可以利用他们很方便的实现,计算机间的网络通讯。
因为Java把数据的传输已经抽象成InputStream和OutputStream的输入输出流,那么对网络通讯来说,其实就是利用ServerSocket类和Socket类建立起来网络连接,进行字节流或者字符流的输入输出操作。
下面我们还是通过一个例子来学习Socket编程:只会装傻的”智能“机器人
直接上代码,服务器端 TalkServer.java :
01 | import java.io.BufferedReader; |
02 | import java.io.IOException; |
03 | import java.io.InputStreamReader; |
04 | import java.io.PrintWriter; |
05 | import java.net.ServerSocket; |
06 | import java.net.Socket; |
07 | |
08 | public class TalkServer { |
09 | |
10 | public static void main(String[] args) throws IOException { |
11 | |
12 | // 创建一个ServerSocket |
13 | ServerSocket server = new ServerSocket( 8080 ); |
14 | |
15 | // 准备接受客户连接,如果有客户连接到,则创建一个socket对象,如果没有客户连接到,那么该程序会停在本行一直等待,像是在睡眠或者假死,这种行为叫做“阻塞”,阻塞是网络通信中的术语,就是你等别人响应,如果必须等到,等不到就一直等,就是阻塞,等不到也继续向前走的当然就是非阻塞。 |
16 | Socket socket = server.accept(); |
17 | |
18 | // 从socket中获取一个输入对象,以便接受从网络上来的数据 |
19 | BufferedReader socketInput = new BufferedReader( new InputStreamReader(socket.getInputStream())); |
20 | |
21 | // 从标准输入中获取一个输入对象,以便接受从键盘上传来的数据,如果想让服务器端和客户端自由对话的话可以用此对象 |
22 | //BufferedReader keyboardInput = new BufferedReader(new InputStreamReader(System.in)); |
23 | |
24 | // 从socket中获取一个 |
25 | PrintWriter socketOutput = new PrintWriter(socket.getOutputStream(), true ); |
26 | |
27 | //定义一些变量 |
28 | String input; |
29 | |
30 | // 一直执行,直到客户端表示要断开 |
31 | while ( true ){ |
32 | //从客户端获取用户输入的字符串 |
33 | input = socketInput.readLine(); |
34 | //发送到屏幕 |
35 | System.out.print( "客户:" ); |
36 | System.out.println(input); |
37 | |
38 | //准备好回复语句 |
39 | String reply= reply(input); |
40 | //发送到客户端 |
41 | socketOutput.println(reply); |
42 | //发送到屏幕 |
43 | System.out.print( "小瑶瑶:" ); |
44 | System.out.println(reply); |
45 | |
46 | //客户如果输入的是再见则退出循环 |
47 | if (input.equals( "再见" )){ |
48 | break ; |
49 | } |
50 | } |
51 | |
52 | //关闭释放资源 |
53 | socketInput.close(); |
54 | socketOutput.close(); |
55 | socket.close(); |
56 | |
57 | } |
58 | |
59 | //回复方法 |
60 | private static String reply(String input) { |
61 | |
62 | String output=replys[number% 7 ]; |
63 | |
64 | if (number% 7 == 5 ){ |
65 | output = output+ " " +input; |
66 | } |
67 | |
68 | number++; |
69 | return output; |
70 | } |
71 | |
72 | //回复方法用到的一些变量 |
73 | static int number = 0 ; |
74 | |
75 | static String[] replys = new String[ 7 ]; |
76 | |
77 | static { |
78 | replys[ 0 ]= "你说的啥,我听不见?" ; |
79 | replys[ 1 ]= "声音再大点行不?" ; |
80 | replys[ 2 ]= "声音再大点一点点行不?" ; |
81 | replys[ 3 ]= "还是听不清……" ; |
82 | replys[ 4 ]= "看来是网络的问题,你要不说慢点?" ; |
83 | replys[ 5 ]= "听到了!听到了!你说的是:" ; |
84 | replys[ 6 ]= "完了,又听不清了……" ; |
85 | } |
86 | |
87 | } |
88 | |
客户端代码 TalkClient.java :
01 | import java.io.BufferedReader; |
02 | import java.io.IOException; |
03 | import java.io.InputStreamReader; |
04 | import java.io.PrintWriter; |
05 | import java.net.Socket; |
06 | import java.net.UnknownHostException; |
07 | |
08 | public class TalkClient { |
09 | |
10 | public static void main(String[] args) throws UnknownHostException, IOException { |
11 | |
12 | Socket socket = new Socket( "127.0.0.1" , 8080 ); |
13 | |
14 | // 从socket中获取一个输入对象,以便接受从网络上来的数据 |
15 | BufferedReader socketInput = new BufferedReader( new InputStreamReader(socket.getInputStream())); |
16 | |
17 | // 从标准输入中获取一个输入对象,以便接受从键盘上传来的数据 |
18 | BufferedReader keyboardInput = new BufferedReader( new InputStreamReader(System.in)); |
19 | |
20 | // 从socket中获取一个 |
21 | PrintWriter socketOutput = new PrintWriter(socket.getOutputStream(), true ); |
22 | |
23 | // 定义一些变量 |
24 | String input; |
25 | |
26 | // 一直执行 |
27 | while ( true ){ |
28 | |
29 | //从键盘获取数据,通过socket对象发送出去 |
30 | input = keyboardInput.readLine(); |
31 | socketOutput.println(input); |
32 | |
33 | //接收从socket中获取的服务器端发回的回应信息,并发送到屏幕上 |
34 | input = socketInput.readLine(); |
35 | System.out.println(input); |
36 | } |
37 | |
38 | } |
39 | |
40 | } |
编译两个文件,先运行TalkServer,开始接收客户端的连接,然后运行客户端,在客户端上打字,服务器端会有回应,运行截图如下,这里上一个服务器端的截图: