通过 Socket 实现 TCP 编程入门

这里我们通过一个用户登录的例子来学习基于 TCP 协议的 Socket 通信。

 

Socket 通信模型

   

Socket通信步骤

 

ServerSocket 构造器和成员方法

1、ServerSocket 构造方法   2、ServerSocket 成员方法  

Socket 构造器和成员方法

1、Socket 构造器   2、Socket 成员方法  

一个服务端和支持多个客户端的对话demo

1、server.java
  1. package com.liuyanzhao;
  2. import java.io.*;
  3. import java.net.InetAddress;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;
  6. /**
  7.  *
  8.  * 基于TCP协议的Socket通信,实现用户登录
  9.  * 服务端
  10.  * @author 言曌
  11.  * @date 2017/12/4 下午7:37
  12.  */
  13. public class Server {
  14.     public static void main(String args[]) {
  15.         try {
  16.             //1、创建一个服务端Socket,即ServerSocket,指定绑定的端口,并监听此端口
  17.             ServerSocket serverSocket = new ServerSocket(8888);
  18.             Socket socket = null;
  19.             //记录客户端的数量
  20.             int count = 0;
  21.             //2、调用accept方法开始监听,等待客户端的连接
  22.             System.out.println("***服务端即将启动,等待客户端的连接****");
  23.             //循环监听等待客户端的连接
  24.             while(true) {
  25.                 //调用accept()方法开始监听,等待客户端的连接
  26.                 socket = serverSocket.accept();
  27.                 //创建一个新的线程
  28.                 ServerThread serverThread = new ServerThread(socket);
  29.                 //启动线程
  30.                 serverThread.start();
  31.                 count ++;//统计客户端的数量
  32.                 System.out.println("客户端的数量:"+count);
  33.                 InetAddress inetAddress = socket.getInetAddress();
  34.                 System.out.println("当前客户端的IP:"+inetAddress.getHostAddress());
  35.             }
  36.         } catch (IOException e) {
  37.             e.printStackTrace();
  38.         }
  39.     }
  40. }
  2、ServerThread.java
  1. package com.liuyanzhao;
  2. import java.io.*;
  3. import java.net.Socket;
  4. /**
  5.  * 服务器线程处理类
  6.  * @author 言曌
  7.  * @date 2017/12/4 下午8:32
  8.  */
  9. public class ServerThread extends Thread {
  10.     //本线程相关的Socket
  11.     Socket socket = null;
  12.     public ServerThread(Socket socket) {
  13.         this.socket = socket;
  14.     }
  15.     //线程执行操作,响应客户端的请求
  16.     public void run() {
  17.         InputStream inputStream = null;//字符输入流
  18.         InputStreamReader inputStreamReader = null;
  19.         BufferedReader bufferedReader = null;
  20.         OutputStream outputStream = null;
  21.         PrintWriter printWriter = null;
  22.         try {
  23.             //获取输入流,并读取客户端信息
  24.             inputStream = socket.getInputStream();
  25.             inputStreamReader = new InputStreamReader(inputStream);//将字节流转换成字符流
  26.             bufferedReader = new BufferedReader(inputStreamReader);//为字符流添加缓存
  27.             String info = null;
  28.             while((info = bufferedReader.readLine()) != null) {
  29.                 System.out.println("我是服务器,客户端说:"+info);
  30.             }
  31.             socket.shutdownInput();//关闭输入流
  32.             //获取输出流,响应客户端的请求
  33.             outputStream = socket.getOutputStream();
  34.             printWriter = new PrintWriter(outputStream);
  35.             printWriter.write("欢迎您!");
  36.             printWriter.flush();//刷新缓存
  37.         } catch (IOException e) {
  38.             e.printStackTrace();
  39.         } finally {
  40.             //关闭资源
  41.             try {
  42.                 if(bufferedReader != null) {
  43.                     bufferedReader.close();
  44.                 }
  45.                 if(outputStream != null) {
  46.                     outputStream.close();
  47.                 }
  48.                 if(inputStreamReader != null) {
  49.                     inputStreamReader.close();
  50.                 }
  51.                 if(inputStream != null) {
  52.                     inputStream.close();
  53.                 }
  54.                 if(socket != null) {
  55.                     socket.close();
  56.                 }
  57.             } catch (IOException e) {
  58.                 e.printStackTrace();
  59.             }
  60.         }
  61.     }
  62. }
  3、Client.java
  1. package com.liuyanzhao;
  2. import java.io.*;
  3. import java.net.Socket;
  4. /**
  5.  * 客户端
  6.  * @author 言曌
  7.  * @date 2017/12/4 下午7:37
  8.  */
  9. public class Client {
  10.     public static void main(String args[]) {
  11.         try {
  12.             //1、创建客户端Socket,指定服务器地址和端口
  13.             Socket socket = new Socket("localhost",8888);
  14.             //2、获取输出流,向服务器端发送信息
  15.             OutputStream outputStream = socket.getOutputStream();//字节输出流
  16.             PrintWriter printWriter = new PrintWriter(outputStream);//将输出流包装为打印流
  17.             printWriter.write("用户名:Tom;密码:123456");
  18.             printWriter.flush();//刷新缓存,输出信息
  19.             socket.shutdownOutput();//关闭输出流
  20.             //3、获取输入流,并读取服务器的响应信息
  21.             InputStream inputStream = socket.getInputStream();
  22.             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
  23.             String info = null;
  24.             while((info = bufferedReader.readLine()) != null) {
  25.                 System.out.println("我是客户端,服务器说:"+info);
  26.             }
  27.             //4、 关闭资源
  28.             printWriter.close();
  29.             bufferedReader.close();
  30.             inputStream.close();
  31.             outputStream.close();
  32.             socket.close();
  33.         } catch (IOException e) {
  34.             e.printStackTrace();
  35.         }
  36.     }
  37. }
  上面的程序支持一个服务端和多个客户端对话。

运行效果

1、先运行 Server 类   2、再运行 Client 类 服务端界面   客户端界面   3、再运行一次 Client 类,再启动一个客户端 服务端界面   客户端界面如上     本文参考:慕课网 本文地址:https://liuyanzhao.com/6907.html      

发表评论

目前评论:1