通过 Socket 实现 TCP 编程入门

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

通过 Socket 实现 TCP 编程入门

通过 Socket 实现 TCP 编程入门

 

Socket 通信模型

通过 Socket 实现 TCP 编程入门

 

 

Socket通信步骤

通过 Socket 实现 TCP 编程入门

 

ServerSocket 构造器和成员方法

1、ServerSocket 构造方法

通过 Socket 实现 TCP 编程入门

 

2、ServerSocket 成员方法

通过 Socket 实现 TCP 编程入门

通过 Socket 实现 TCP 编程入门

 

Socket 构造器和成员方法

1、Socket 构造器

通过 Socket 实现 TCP 编程入门

 

2、Socket 成员方法

通过 Socket 实现 TCP 编程入门

通过 Socket 实现 TCP 编程入门

通过 Socket 实现 TCP 编程入门

 

一个服务端和支持多个客户端的对话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 类

通过 Socket 实现 TCP 编程入门

 

2、再运行 Client 类

服务端界面

通过 Socket 实现 TCP 编程入门

 

客户端界面

通过 Socket 实现 TCP 编程入门

 

3、再运行一次 Client 类,再启动一个客户端

服务端界面

通过 Socket 实现 TCP 编程入门

 

客户端界面如上

 

 

本文参考:慕课网

本文地址:https://liuyanzhao.com/6907.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半缘修道半缘君丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值