用Socket实现简单客户端和服务端通信。
正文:
服务端的编写:
1 public class ServerDemo {
2
3 public static void main(String[] args) {
4
5 try {
6 //创建ServerSocket,并指定端口
7 ServerSocket serverSocket=new ServerSocket(8888);
8 System.out.println("服务器即将启动,并等待连接");
9 //调用accept()方法,监听并接受到服务端的连接。当连接时,返回获得的Socket实例
10 Socket socket=serverSocket.accept();
11
12
13
14 //通过获得的Socket得到字节输入流InputStream,用来读取客户端发送的信息
15 InputStream inputStream=socket.getInputStream();
16 //将字节流转换为字符流
17 InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
18 //添加缓存
19 BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
20 String info=null;
21 //读取信息
22 while((info=bufferedReader.readLine())!=null){
23 System.out.println(info);
24 }
25 //调用shutdownInput关闭输入流
26 socket.shutdownInput();
27
28 System.out.println("服务端已接收到请求,开始响应信息");
29
30 //获取输出流
31 OutputStream outputStream=socket.getOutputStream();
32 //转换为打印流
33 PrintWriter printWriter=new PrintWriter(outputStream);
34 printWriter.write("客户端你好,欢迎使用");
35 printWriter.flush();
36 //关闭输出流
37 socket.shutdownOutput();
38
39 //关闭资源
40 printWriter.close();
41 bufferedReader.close();
42 inputStreamReader.close();
43
44 //关闭输入输出流
45 outputStream.close();
46 inputStream.close();
47
48 //关闭Socket
49 socket.close();
50 /*//关闭ServerSocket
51 serverSocket.close();*/
52
53 } catch (IOException e) {
54 // TODO Auto-generated catch block
55 e.printStackTrace();
56 }
57
58 }
59
60 }
客户端的编写:
1 public class ClientDemo {
2
3 public static void main(String[] args) {
4
5 try{
6 //创建Socket,并指定服务器地址和端口号
7 Socket socket=new Socket("127.0.0.1",8888);
8
9 //通过Socket获取输出流
10 OutputStream outputStream=socket.getOutputStream();
11 //将输出流转换为为打印流
12 PrintWriter printWriter=new PrintWriter(outputStream);
13 //向服务端发送信息
14 printWriter.write("你好,服务端");
15 printWriter.write("如果接受到请求,请回应");
16 printWriter.flush();
17
18 //关闭输出流
19 socket.shutdownOutput();
20
21 System.out.println("已获取服务器响应,回复如下:");
22
23 //获取输入流
24 InputStream inputStream=socket.getInputStream();
25 //转换为字符流
26 InputStreamReader inputStreamReader=new InputStreamReader(inputStream);
27 //添加缓存
28 BufferedReader bufferedReader=new BufferedReader(inputStreamReader);
29 String info=null;
30 while((info=bufferedReader.readLine())!=null){
31 System.out.println(info);
32 }
33 //关闭输入流
34 socket.shutdownInput();
35
36 //关闭资源
37 bufferedReader.close();
38 inputStreamReader.close();
39 printWriter.close();
40
41 //关闭输入输出流
42 inputStream.close();
43 outputStream.close();
44
45 //关闭Socket
46 socket.close();
47 }catch(Exception e){
48 e.printStackTrace();
49 }
50 }
51
52 }
至此,服务端和客户端的通信已简单实现。
注意点:
- 在进行连接时,不可以提前关闭输入输出流,包括字节流转换的各种流,一定要在连接结束时统一关闭。如果在连接的中途关闭了流,会造成Socket的关闭,连接中断。
- shutdownInput()和shutdownOutput()是一种单向关闭流,即关闭客户端并不会影响服务端。
- 在调用shutdownInput()和shutdownOutput()时,虽然其关闭了对应的输入或输出流,并且不会关闭网络连接。但是当在同一个连接中不能再获得对应的输入输出流,