JAVA网络编程

来源:互联网 发布:python os fork exec 编辑:程序博客网 时间:2024/05/16 17:10
 

lesson21

本讲内容: socket 只会装傻的”智能“机器人

套接字(socket)是代表计算机之间网络连接的对象。要进行计算机间的网络通讯,建立TCP连接,那么就需要Socket编程,Java提供了ServerSocket类和Socket类,可以利用他们很方便的实现,计算机间的网络通讯。

因为Java把数据的传输已经抽象成InputStream和OutputStream的输入输出流,那么对网络通讯来说,其实就是利用ServerSocket类和Socket类建立起来网络连接,进行字节流或者字符流的输入输出操作。

下面我们还是通过一个例子来学习Socket编程:只会装傻的”智能“机器人

直接上代码,服务器端 TalkServer.java :

01importjava.io.BufferedReader;
02importjava.io.IOException;
03importjava.io.InputStreamReader;
04importjava.io.PrintWriter;
05importjava.net.ServerSocket;
06importjava.net.Socket;
07  
08publicclassTalkServer {
09  
10    publicstaticvoidmain(String[] args) throwsIOException {
11  
12        // 创建一个ServerSocket
13        ServerSocket server =newServerSocket(8080);
14  
15        // 准备接受客户连接,如果有客户连接到,则创建一个socket对象,如果没有客户连接到,那么该程序会停在本行一直等待,像是在睡眠或者假死,这种行为叫做“阻塞”,阻塞是网络通信中的术语,就是你等别人响应,如果必须等到,等不到就一直等,就是阻塞,等不到也继续向前走的当然就是非阻塞。
16        Socket socket = server.accept();
17  
18        // 从socket中获取一个输入对象,以便接受从网络上来的数据
19        BufferedReader socketInput =newBufferedReader(newInputStreamReader(socket.getInputStream()));
20  
21        // 从标准输入中获取一个输入对象,以便接受从键盘上传来的数据,如果想让服务器端和客户端自由对话的话可以用此对象
22        //BufferedReader keyboardInput = new BufferedReader(new InputStreamReader(System.in));
23  
24        // 从socket中获取一个
25        PrintWriter socketOutput =newPrintWriter(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    privatestaticString 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        returnoutput;
70    }
71  
72    //回复方法用到的一些变量
73    staticintnumber =0;
74  
75    staticString[] replys = newString[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 :

view source
print?
01importjava.io.BufferedReader;
02importjava.io.IOException;
03importjava.io.InputStreamReader;
04importjava.io.PrintWriter;
05importjava.net.Socket;
06importjava.net.UnknownHostException;
07  
08publicclassTalkClient {
09  
10    publicstaticvoidmain(String[] args) throwsUnknownHostException, IOException {
11  
12        Socket socket =newSocket("127.0.0.1",8080);
13  
14        // 从socket中获取一个输入对象,以便接受从网络上来的数据
15        BufferedReader socketInput =newBufferedReader(newInputStreamReader(socket.getInputStream()));
16  
17        // 从标准输入中获取一个输入对象,以便接受从键盘上传来的数据
18        BufferedReader keyboardInput =newBufferedReader(newInputStreamReader(System.in));
19  
20        // 从socket中获取一个
21        PrintWriter socketOutput =newPrintWriter(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,开始接收客户端的连接,然后运行客户端,在客户端上打字,服务器端会有回应,运行截图如下,这里上一个服务器端的截图:

image

原创粉丝点击