这里我们通过一个用户登录的例子来学习基于 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

通过 Socket 实现 TCP 编程入门相关推荐

  1. TCP原理,Socket与网络编程入门

    TCP原理,Socket与网络编程入门 开篇 从互联网的诞生以来,网络程序逐渐普及.计算机网络将各个计算机连接到一起使它们可以通信.在现代,网络已成为我们十分重要的一部分.这次不搞些费脑子的东西,就让 ...

  2. Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤...

    TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题. Jav ...

  3. JAVA 通过 Socket 实现 TCP 编程

    简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...

  4. java tcp实现_JAVA 通过 Socket 实现 TCP 编程

    简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...

  5. linux网络编程socket,Linux网络编程入门

    socket又叫做套接字,网络编程又叫做套接字编程.而socket地址也称为套接字地址,可以理解为计算机的网络地址. 1.理解socket地址 假设小明同学想给女神打电话需要知道对方的电话号码才能继续 ...

  6. python网络-Socket之TCP编程(26)

    一.TCP简介 1.TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TC ...

  7. Java的Socket通信----通过 Socket 实现 TCP 编程之多线程demo(2)

    JAVA Socket简介 所谓socket 通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答 ...

  8. 使用多线程实现多客户端的连接(通过Socket实现TCP编程)

    服务器线程类 package com.susu;import java.io.BufferedReader; import java.io.IOException; import java.io.In ...

  9. java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)

    文章目录 前言 一.网络编程概述 二.网络通信要素概述 1.如何实现网络中的主机互相通信 2.网络通信协议 3.IP和端口号 4.InetAddress类 5.网络协议 6.TCP/IP协议簇 7.T ...

  10. Java基础 - 网络编程 - InetAddress类、Socket(TCP)举例使用

    文章目录 InetAddress类 相关方法 代码举例 Socket 基本介绍 基本介绍2 应用案例(TCP字节流) 应用案例2(TCP字节流) 注意(结束标记) 应用案例3(TCP字符流) 注意(结 ...

最新文章

  1. MySQL 优化原理(一)
  2. linux内核链表使用例,Linux设备驱动工程师之路——内核链表的使用
  3. C#中dynamic的正确用法 以及 typeof(DynamicSample).GetMethod(Add);
  4. 【联盛德W806上手笔记】七、I2C
  5. [你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望
  6. 台式机电脑配置单_2020年电脑配置单重点硬件参考
  7. 单例模式在JDK应用的源码分析
  8. python 动态相册_Python编程:制作电子相册
  9. 新华三副总裁李立:建设智慧城市的三大误区
  10. git merge 和 git rebase 小结
  11. java开发微信提现_java 微信提现至零钱
  12. MapGuide open source开发心得一:简介
  13. win7录屏_录屏软件推荐用什么?绝地求生录屏游戏的工具分享
  14. 如何在华为云上服务器部署WEB网站
  15. 合作小红书探店博主需要注意什么?流程是怎样的?
  16. CentOS 7的时间设置
  17. r5处理器_联想拯救者r7000 r7与r5哪个更值得买?差距大吗?下面价格和配置对比评测看完就明白了...
  18. 第一天:python的安装及print函数简单使用
  19. 数据库周刊36丨2020年8月数据库排行;云厂商腾讯云增速第一;OceanBase集群安装;Oracle RAC调整网卡MTU值;不改代码解决sql性能问题;Mysql索引研究;TiDB电子书……
  20. 从Map中 取出第一个key/第一个value的方法

热门文章

  1. 双11当天,淘宝搜索如何让CPU使用率降45%,GMV提1% | 论文
  2. 本地Exchange和exchange online混合部署后OWA统一登录的实现
  3. UIView 不规则剪裁
  4. 【二分答案】【中位数】codeforces 394 bun
  5. OpenCV关于隐马尔科夫模型的结构和函数
  6. 10年年初写的述职报告
  7. Qt实现带验证码的输入框
  8. 【java与智能设备】CH07_01_Android中的文件存储
  9. 软件测试 集成测试
  10. 反激变换器matlab仿真变压器demo,反激变换器建模Matlab仿真