网络编程中客户端和服务端通信过程、原理及代码示例

Socket 通信机制详解 阅读详情

学习任何东西,我们只要搞清楚其原理,就会触类旁通。现在结和我所学,我想总结一下客户端到服务器端的通信过程。只有明白了原理,我们才会明白当我们程序开发过程中错误的问题会出现在那,才会更好的解决问题。

我们首先要了解一个概念性的词汇:Socket

socket的英文原义是“孔”或“插座”。作为进程通信机制,取后一种意思。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。(其实就是两个程序通信用的。)socket非常类似于电话的插座。以一个电话网为例。电话的通话双方相当于相互通信的2个程序,电话号码可以当作是IP地址。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码(IP地址),相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求。对方假如在场并空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤消连接,通信完成。

以上通信是以两个人通话做为事例来在概的说明了下通信,但是现在假如通信中的一个人是外国人(说英语),一个人是中国人(说普通话),他们俩相互通信的话,都不能听明白对方说的是什么,那么他们的沟通就不能够完成。但是如果我们给一个规定,给通话双方,只能讲普通话,那么双方沟通就没有障碍了。这就引出来了通信协议。

有两种类型:(Tcp协议与Udp协议):

Tcp协议与Udp协议是在两硬件设备上进行通信传输的一种数据语法。

– 流式Socket(STREAM):

是一种面向连接的Socket,针对于面向连接的TCP服务应用,安全,但是效率低;Tcp:是以流的形式来传的。

– 数据报式Socket(DATAGRAM):

是一种无连接的Socket,对应于无连接的UDP服务应用.不安全(丢失,顺序混乱,在接收端要分析重排及要求重发),但效率高.Udp:将数据包拆开为若干份编号后来传输。在传输的过程中容易出现数据的丢失。但是传输速度要比TCP的快。

Socket的通信流程

  • Demo:

  • 服务器端:

– 申请一个socket (socketWatch)用来监听的

– 绑定到一个IP地址和一个端口上

– 开启侦听,等待接授客户端的连接

– 当有连接时创建一个用于和连接进来的客户端进行通信的socket(socketConnection)

– 即续监听,等侍下一个客户的连接

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Net;//IPAdress,IPEndPoint(ip和端口)类
using System.Net.Sockets;
using System.Threading;
using System.IO;

namespace MyChatRoomServer
{
    public partial class FChatServer : Form
    {
        public FChatServer()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;//关闭 对 文本框  的跨线程操作检查
        }

        Thread threadWatch = null;//负责监听 客户端 连接请求的 线程
        Socket socketWatch = null;//负责监听的 套接字

        private void btnBeginListen_Click(object sender, EventArgs e)
        {
            //创建 服务端 负责监听的 套接字,参数(使用IP4寻址协议,使用流式连接,使用TCP协议传输数据)
            socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           //获得文本框中的 IP地址对象
            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
            //创建 包含 ip 和 port 的网络节点对象
            IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
            //将 负责监听 的套接字 绑定到 唯一的IP和端口上
            socketWatch.Bind(endpoint);
            //设置监听队列的长度
            socketWatch.Listen(10);

            //创建 负责监听的线程,并传入监听方法
            threadWatch = new Thread(WatchConnecting);
            threadWatch.IsBackground = true;//设置为后台线程
            threadWatch.Start();//开启线程
            ShowMsg("服务器启动监听成功~");
            //IPEndPoint 
            //socketWatch.Bind(
        }
        //保存了服务器端 所有负责和客户端通信的套接字
        Dictionary<string, Socket> dict = new Dictionary<string, Socket>();
        //保存了服务器端 所有负责调用 通信套接字.Receive方法 的线程
        Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>();

        //Socket sokConnection = null;
        /// <summary>
        /// 监听客户端请求的方法
        /// </summary>
        void WatchConnecting()
        {
            while (true)//持续不断的监听新的客户端的连接请求
            {
                //开始监听 客户端 连接请求,注意:Accept方法,会阻断当前的线程!
                Socket sokConnection = socketWatch.Accept();//一旦监听到客户端的请求,就返回一个负责和该客户端通信的套接字 sokConnection
                //sokConnection.Receive
                //向 列表控件中 添加一个 客户端的ip端口字符串,作为客户端的唯一标识
                lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString());
                //将 与客户端通信的 套接字对象 sokConnection 添加到 键值对集合中,并以客户端IP端口作为键
                dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);

                //创建 通信线程
                ParameterizedThreadStart pts = new ParameterizedThreadStart(RecMsg);
                Thread thr = new Thread(pts);
                thr.IsBackground = true;//设置为
                thr.Start(sokConnection);//启动线程 并为线程要调用的方法RecMsg 传入参数sokConnection

                dictThread.Add(sokConnection.RemoteEndPoint.ToString(), thr);//将线程 保存在 字典里,方便大家以后做“踢人”功能的时候用

                ShowMsg("客户端连接成功!" + sokConnection.RemoteEndPoint.ToString());
                //sokConnection.RemoteEndPoint 中保存的是 当前连接客户端的 Ip和端口
            }
        }

        /// <summary>
        /// 服务端 负责监听 客户端 发送来的数据的 方法
        /// </summary>
        void RecMsg(object socketClientPara)
        {
            Socket socketClient = socketClientPara as Socket;
            while (true)
            {
                //定义一个 接收用的 缓存区(2M字节数组)
                byte[] arrMsgRec = new byte[1024 * 1024 * 2];
                //将接收到的数据 存入 arrMsgRec 数组,并返回 真正接收到的数据 的长度
                int length=-1;
                try
                {
                    length = socketClient.Receive(arrMsgRec);
                }
                catch (SocketException ex)
                {
                    ShowMsg("异常:" + ex.Message);
                    //从 通信套接字 集合中 删除 被中断连接的 通信套接字对象
                    dict.Remove(socketClient.RemoteEndPoint.ToString());
                    //从 通信线程    结合中 删除 被终端连接的 通信线程对象
                    dictThread.Remove(socketClient.RemoteEndPoint.ToString());
                    //从 列表中 移除 被中断的连接 ip:Port
                    lbOnline.Items.Remove(socketClient.RemoteEndPoint.ToString());
                    break;
                }
                catch (Exception ex)
                {
                    ShowMsg("异常:" + ex.Message);
                    break;
                }
                if (arrMsgRec[0] == 0)//判断 发送过来的数据 的第一个元素是 0,则代表发送来的是 文字数据
                {
                    //此时 是将 数组 所有的元素 都转成字符串,而真正接收到的 只有服务端发来的几个字符
                    string strMsgRec = System.Text.Encoding.UTF8.GetString(arrMsgRec,1, length-1);
                    ShowMsg(strMsgRec);
                }
                else if (arrMsgRec[0] == 1)//如果是1 ,则代表发送过来的是 文件数据(图片/视频/文件....)
                {
                    SaveFileDialog sfd = new SaveFileDialog();//保存文件选择框对象
                    if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)//用户选择文件路径后
                    {
                        string fileSavePath = sfd.FileName;//获得要保存的文件路径
                        //创建文件流,然后 让文件流来 根据路径 创建一个文件
                        using (FileStream fs = new FileStream(fileSavePath, FileMode.Create))
                        {
                            fs.Write(arrMsgRec, 1, length-1);
                            ShowMsg("文件保存成功:" + fileSavePath);
                        }
                    }
                }
            }
        }

        //发送消息到客户端
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(lbOnline.Text))
            {
                MessageBox.Show("请选择要发送的好友");
            }
            else
            {
                string strMsg = txtMsgSend.Text.Trim();
                //将要发送的字符串 转成 utf8对应的字节数组
                byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
                //获得列表中 选中的KEY
                string strClientKey = lbOnline.Text;
                //通过key,找到 字典集合中对应的 与某个客户端通信的 套接字的 send方法,发送数据给对方
                try
                {
                    dict[strClientKey].Send(arrMsg);
                    //sokConnection.Send(arrMsg);
                    ShowMsg("发送了数据出去:" + strMsg);
                }
                catch (SocketException ex)
                {
                    ShowMsg("发送时异常:"+ex.Message);
                }
                catch (Exception ex)
                {
                    ShowMsg("发送时异常:" + ex.Message);
                }
            }
        }

        //服务端群发消息
        private void btnSendToAll_Click(object sender, EventArgs e)
        {
            string strMsg = txtMsgSend.Text.Trim();
            //将要发送的字符串 转成 utf8对应的字节数组
            byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
            foreach (Socket s in dict.Values)
            {
                s.Send(arrMsg);
            }
            ShowMsg("群发完毕!:)");
        }

        #region 显示消息
        /// <summary>
        /// 显示消息
        /// </summary>
        /// <param name="msg"></param>
        void ShowMsg(string msg)
        {
  • 客户端:

– 申请一个socket(socketClient)

– 连接服务器(指明IP地址和端口号)

代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Net.Sockets;

using System.Net;

using System.Threading;

namespace MyChatRoomClient

{

    public partial class FChatClient : Form

    {

        public FChatClient()

        {

            InitializeComponent();

            TextBox.CheckForIllegalCrossThreadCalls = false;

        }

        Thread threadClient = null; //客户端 负责 接收 服务端发来的数据消息的线程

        Socket socketClient = null;//客户端套接字

//客户端发送连接请求到服务器

        private void btnConnect_Click(object sender, EventArgs e)

        {

            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());//获得IP

            IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));//网络节点

//创建客户端套接字

            socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //向 指定的IP和端口 发送连接请求

            socketClient.Connect(endpoint);

            //客户端 创建线程 监听服务端 发来的消息

            threadClient = new Thread(RecMsg);

            threadClient.IsBackground = true;

            threadClient.Start();

        }

        /// <summary>

/// 监听服务端 发来的消息

/// </summary>

        void RecMsg()

        {

            while (true)

            {

                //定义一个 接收用的 缓存区(2M字节数组)

                byte[] arrMsgRec = new byte[1024 * 1024 * 2];

                //将接收到的数据 存入 arrMsgRec 数组,并返回 真正接收到的数据 的长度

               int length=  socketClient.Receive(arrMsgRec);

                //此时 是将 数组 所有的元素 都转成字符串,而真正接收到的 只有服务端发来的几个字符

               string strMsgRec = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, length);

                ShowMsg(strMsgRec);

            }

        }

        void ShowMsg(string msg)

        {

            txtMsg.AppendText(msg + "\r\n");

        }

    }

}

通信过程图

通过以上流程图我们可以看出,客户端与服务器端之间的一个基本通信流程,概括一下Socket 一般应用模式(客户端和服务器端)的作用:

服务器端:最少有两个socket,一个是服务端负责监听客户端发来连接请求,但不负责与请求的客户端通信,另一个是每当服务器端成功接收到客户端时,但在服务器端创建一个用与请求的客户端进行通信的socket.

客户端:指定要连接的服务器端地址和端口,通过创建一个socket对象来初始化一个到服务器端的TCP连接。

IOCP网络编程:高效客户端和服务端实现 在客户端实现之前,需要和服务器端一同定义好通信协议。这通常包括:数据包格式:明确数据包的头部结构,如包标识、数据长度等。协议行为:定义客户端与服务端之间的交互规则,包括握手、心跳、业务数据交换等。协议版本控制:随着系统演进,协议可能发生变化。需要有版本控制机制来保证向后兼容。 阅读详情

相关推荐

基于Pixhawk与OpenMV的无人机视觉引导精准降落系统设计与实现

本文详细介绍了基于Pixhawk飞控与OpenMV视觉模块的无人机精准降落系统设计与实现。系统通过OpenMV识别Apriltag标签,结合MAVLink通信将视觉数据发送给Pixhawk,实现厘米级精准降落。文章涵盖硬件连接、软件配置、核心代码逻辑解析及实战调试技巧,为无人机自动充电、物流配送等场景提供可靠解决方案。

weixin_29189377的博客 320

客户端到服务器端的通信过程及原理

学习任何东西,我们只要搞清楚其原理,就会触类旁通。现在结和我所学,我想总结一下客户端到服务器端的通信过程。只有明白了原理,我们才会明白当我们程序开发过程中错误的问题会出现在那,才会更好的解决问题。 我们首先要了解一个概念性的词汇:Socket socket的英文原义是“孔”或“插座”。作为进程通信机制,取后一种意思。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。(其

时光代码 6562

Claude Skills 深度讲解

阶段 1:Function Call(2023)├─ 大模型可以调用外部工具├─ 问题:缺乏对任务的深度理解└─ 局限:工具调用简单线性阶段 2:MCP 上下文工程(2024)├─ 大模型有了更丰富的上下文和工具├─ 问题:仍然需要手动编写复杂的 Prompt└─ 局限:每次对话都需要重新加载上下文阶段 3:Claude Skills(2025)├─ 大模型有了「能力模块」的概念├─ 可以动态加载、组合、执行专门的工作流├─ 真正实现了「知识的模块化和复用」

u013134676的博客 1464

网络请求从客户端到服务端的详细过程

此文目的把网络包端到端传输的流程串起来,篇幅较长,起到抛砖引玉的作用。

enchant06的专栏 4528

MATLAB双目相机标定:从工具箱实战到参数精解

本文详细讲解了使用MATLAB进行双目相机标定的完整实战流程与参数精解。从拍摄合格的棋盘格图像、设置关键参数(如径向畸变系数),到分析重投影误差、优化结果并正确导出和使用内外参,提供了从操作到原理的全面指导,帮助读者为立体视觉应用奠定精准基础。

weixin_29041767的博客 257

【33】软考软件设计师——算法题(二):贪心法与回溯法深度精讲|第4题进阶满分攻略

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第33篇,承接第32篇分治法与动态规划,聚焦**下午第4题算法大题进阶核心**,详解贪心法与回溯法两大高频难点算法。全文超4000字深度拆解贪心法核心原理、贪心选择性质、局部最优推全局最优的底层逻辑,厘清贪心算法适用边界与经典误区;深挖回溯法深度优先遍历思想、递归回溯三步流程、可行性剪枝与最优性剪枝两大核心技巧;全覆盖活动选择、零钱兑换、01背包贪心禁区、八皇后、全排列等软考必考经典题型;配套标准化算法框架代码、考场填空模板、剪枝优化实操案例

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 439

输入URL,客户端到服务器通信的过程

1、输入URL,客户端到服务器的通信过程 2、Http、Https的通信过程和区别

betterdavid的博客 1283

基于Qt C++开发一个体测数据管理系统

advice.dietAdvice = "饮食建议:\n1. 控制总热量摄入,每天减少300-500大卡\n2. 减少精制碳水(白米饭、白面包、甜食)\n3. 增加优质蛋白和膳食纤维摄入\n4. 烹饪方式以蒸、煮、烤、凉拌为主,减少油炸\n5. 晚餐适量减少,睡前3小时避免进食";dataTable->setHorizontalHeaderLabels({"ID", "用户名", "身高(cm)", "体重(kg)", "BMI", "体脂率(%)", "记录时间"});

寒寒豆豆软件公司的博客 192

客户端与服务器之间的通信过程

客户端与服务器之间的通信过程主要分为三步:请求——处理——响应 1、客户端发起请求 2、服务器处理本次请求 3、服务器响应客户端

weixin_58414196的博客 3701

使用 MATLAB/Simulink 构建一个分布式光伏-储能联合系统在配电网中的协同控制模型

本文介绍了使用MATLAB/Simulink构建分布式光伏-储能联合系统协同控制模型的方法。该系统包含光伏发电、储能、负荷和控制器等模块,通过协同控制实现能量优化管理。建模过程详细说明了从创建项目、搭建组件到实现控制策略的步骤,包括光伏特性模拟、储能参数设置和负荷需求建模。重点设计了协同控制器算法,实时调节电力分配,并展示了系统运行指标和经济效益分析。该方法为多能互补系统在配电网中的应用提供了技术验证,未来可进一步优化控制算法和场景适应性。

MHD0815的博客 310

《UDS协议从入门到精通》系列——图解0x19:读取故障码信息

认识最核心的诊断服务“0x19”!!全网最强图解!一文搞懂所有常用子服务!

车载系统攻城狮 1万+

数据包传输的全过程

第一个什么是FTP?FTP是英文File Transfer Protocol的缩写,意思是文件传输协议。它和HTTP一样都是Internet上广泛使用的协议,用来在两台计算机之间互相传送文件。相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到两个TCP连接,一个是命令链路,用来在FTP客户端与服务器之间传递命令;另一个是数据链路,用来上传或下载数据。FTP协议有...

diaoyi6612的博客 2194

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java网络编程学习[狂神说java-网络编程实战讲解笔记]

java多线程基础学习网络编程1.IP2.端口3.TCP信息传输文件上传4.UDP聊天教室实现5.URL 建议先学计算机网络原理 网络编程 所有的资料来源都是以【狂神说Java】网络编程实战讲解 【狂神说Java】网络编程实战讲解 建议看视频,这篇博客是笔记 1.IP 本地:127.0.0.1 :localhost 2.端口 公有端口0~1023 HTTP:80 HTTPS: 443 FTP:21 Telnet: 23 程序注册端口: 1024~49151,分配用户或者程序 Tomcat

Alivorth的博客 1040

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

黑马程序员_java网络编程

 ------------- android培训、java培训、java博客、java学习型技术博客、期待与您交流! -------------- 网络编程: 网络协议与TCP/IP,TCP/IP是目前网络应用程序的首选协议。 我们现在所学的网络编程也是基于TCP/IP协议的。 编写基于基于TCP/IP协议的网络程序,必须先了解两个重要的概念:IP地址和Port(端口号) IP地址

zackjary的专栏 282

网络编程原理:回显服务器与客户端通信交互功能

交换机是因为路由器的LAN口过少,而需要连接到路由器的节点过多,这时候交换机的WAN通过连接路由器的LAN口,然后通过交换机的LAN口来连接其他的路由器的WAN或者电脑,来实现层层连接,构成更复杂的网络结构。在计算机中,通过网络,可以让两个主机之间相互通信,在实现相互通信的过程时,需要我们开发者通过应用程序(应用层)通过系统的API与传输层进行交互。在网络中,本质是通过光/电信号来传输数据,通过低电平表示1,高电平表示0 ,高频光信号表示1 ,低频光信号表示0。

Freedom的博客 8124

Socket编程客户端和服务端通信过程

客户端与服务端通信的原理 代码实现 一个服务器接收一个客户端的消息 客户端代码 package demo2; import java.io.IOException; import java.io.InputStream; import java.io.Out...

我们提供的不是程序,而是产品和服务。 1241

C++网络编程

网络通信socket 计算机是通过TCP/IP协议进行互联从而进行通信的,为了把复杂的TCP/IP协议隐藏起来,更方便的实现计算机中两个程序进行通信,引出了socket这个概念。 socket翻译为套接字,可以理解为IP地址与端口号的组合。 socket提供了流(stream)和数据报(datagram)两种通信机制,即流socket(SOCK_STREAM)和数据报socket(SOCK_DGRAM)。 流socket基于TCP协议,是一个有序、可靠、双向字节流的通道,传输数据不会丢失、不会重复、顺序也

后端开发,记录学习心得 2万+

基于TCPUDP的简单客户端和服务端通讯程序

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于流的通信协议。它是互联网协议栈(TCP/IP)中的核心协议之一,主要用于保证在计算机网络中可靠地传输数据。TCP通信的基本特点:面向连接:在发送数据之前,TCP要求通信双方(客户端和服务器)首先建立一个连接,这个过程被称为“三次握手”。连接建立后,数据才可以传输;数据传输完成后,需要释放连接(通过“四次挥手”关闭连接)。可靠传输:TCP保证数据包的正确传输。

欢迎访问我的个人Blog网站:blog.homeryland.org 1829

LabVIEW搭建的客户端和服务端示例:轻松实现网络通信

LabVIEW搭建的客户端和服务端示例:轻松实现网络通信 去发现同类优质开源项目:https://gitcode.com/ LabVIEW搭建的客户端和服务端示例,是一款基于SOCKET通信的简易网络编程框架,助您快速搭建客户端与服务端的通信桥梁。 项目介绍 LabVIEW搭建的客户端和服务端示例,为您提供了一种简单易行的网络通信解决方案。通过使用LabVIEW语言,此示例展示了如何构建基本的客户...

gitblog_06793的博客 471

Java实现Socket通信-实现客户端和服务端之间通信

用到的知识: IO流 Socket 先建立好客户端,将要发送的数据转为字符流加载到缓冲区 Client.java package com.ifueen.classtest.socket; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.i...

f2315895270的博客 2927

LabVIEW搭建的客户端和服务端示例

LabVIEW搭建的客户端和服务端示例 去发现同类优质开源项目:https://gitcode.com/ 此资源库包含了一个使用LabVIEW语言编写的客户端和服务端通信示例。本示例基于基本的SOCKET控件,实现了客户端与服务器之间的基本通信功能。 简介 此示例旨在提供一个简单的通信框架,展示如何使用LabVIEW进行网络编程。在这个示例中,服务器端监听指定端口,等待客户端的连接请求。客户端可以...

gitblog_06761的博客 874

Java网络编程之通过代码实现Socket通信

概述 Socket类 构造方法 成员方法 ServerSocket类 构造方法 成员方法 简单的TCP网络程序 TCP通信分析图解 客户端向服务器发送数据 服务器向客户端回写数据

write less , do more 9332

黑马程序员--10.网络编程--06.【Clinet_Server通信原理】【TCP_客户端和服务端会话】【阻塞式方法的详解】

网络编程--6 C/S通信原理(Client/Server)  TCP客户端和服务端会话 ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ 1.    C/S通信原理 1). 服务器端的特点 (1). 一个服务端的存在可以允许接入多个客户端 (2). Server端和单个Client端通信过程 {1}. 服务

歆明正航的专栏 2395

TCP客户端和服务端通信

TCP客户端和服务端通信 额外工具:TCP调试助手。 先进入cmd命令符查询自己的电脑IP。 客户端代码: package network; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class TCPClient { public static void main(String[] args) throws IOException{ // TODO Auto-

qq_40998493的博客 208

Linux网络编程:简易客户端和服务端的实现

Directory通信流程服务端客户端一些小问题服务端代码客户端代码 通信流程 服务端 socket()—>创建套接字(用于监听) bind()------>绑定地址结构 listen()----->设置最大监听套接字数量 accept()---->阻塞等待客户端连接(返回一个新的套接字用于通信) read()------->读取数据 foo()--------->处理数据 write()------->写回数据 close()------->返回第5步或结

NiGo的博客 1792
上一篇: 多进程和多线程之间的通信方式及通信实现步骤小结
下一篇: TCP与UDP协议的特点及区别小结
Solid7
博客等级 码龄11年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值