当前位置: 首页 > news >正文

『原创』PPC和PC使用TCP通讯——简单实现

在之前,我曾经写过一个PPC通过UDP和PC端进行通讯的简单例子,大家可以到这里查看,多的我就不说了,咱们直接进入主题。

本文意在介绍如何使用.net cf类库中的套接字类库,与桌面程序完成一个简单的TCP通讯,在此之前,你可能需要简单了解如下知识:

1、套接字

2、面向连接的套接字

这些知识点请大家自行查找,在这里我就不赘述了,只是强调这个很重要哦。

下面,我们来为程序写入代码,首先,定义客户端为PPC端,使用的环境为Wm5 for ppc模拟器,当然,在开始之前,请按照这篇文章对模拟器进行配置,以便进行之后的网络工作——『原创』+『转载』配置模拟器网络环境(访问局域网)Step by Step!

配置好以后,我们新建一个解决方案,其中包含了一个C#控制台应用程序(TCP-Server),以及一个C#的PPC普通程序项目(PPC-Client,WM5,.netcf 2.0)。

先看看客户端(PPC-client)的界面设计吧:

用一个ListBOx用于显示数据交换信息,底部两个功能按钮,就这么简单。

接着为客户端编写代码如下:

 

PPC-Client
using System;

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

namespace PPC_Client
{
    
public partial class PPCclient : Form
    {
        
public PPCclient()
        {
            InitializeComponent();
        }
        Socket server;
        IPAddress adr;
        IPEndPoint ep;
        
byte[] buffer=new byte[1024];
        
int end;
        
private void PPCclient_Load(object sender, EventArgs e)
        {
            server 
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);//为套接字制定属性
            adr = IPAddress.Parse("192.168.1.29");//为套接字准备好远程服务器的IP
            ep = new IPEndPoint(adr, 3000);//为套接字初始化EndPoint
        }

        
private void menuItem1_Click(object sender, EventArgs e)
        {
            
try
            {
                server.Connect(ep);
//与远程终结点连接
                if (server.Receive(buffer) > 0)//如果有数据
                {
                    lbInfo.Items.Clear();
                    lbInfo.Items.Add(
"连接上");
                    lbInfo.Items.Add(
"从服务器获取数据");
                    
while (buffer[end] != 0)
                    {
                        lbInfo.Items.Add(buffer[end].ToString());
                        end
++;//增加偏移量
                    }
                    lbInfo.Items.Add(
"连接断开");

                }
            }
            
catch (SocketException se)
            {
                MessageBox.Show(se.Message);
            }
            
finally
            {
                server.Shutdown(SocketShutdown.Both);
//关闭连接
                server.Close();//关闭套接字
            }

        }

        
private void menuItem2_Click(object sender, EventArgs e)
        {
            
this.Close();
        }
        

    }
}

 

代码很简单,主要逻辑:1、程序初始化时,设置套接字的各个属性。2、点击连接服务器按钮,开始从服务器获取数据并添加到ListBox中,然后断开服务器

在准备好客户端后,我们要为服务器端编写简单的代码了,代码如下:

 

TCP-Server
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace TCP_Server
{
    
class Program
    {

        
static void Main(string[] args)
        {
            Socket client, serverSocket;
            IPAddress adr;
            IPEndPoint ep;

            serverSocket 
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            adr 
=IPAddress.Parse("192.168.1.29");
            ep 
= new IPEndPoint(adr, 3000);
            serverSocket.Bind(ep);
            serverSocket.Listen(
3);
            
while (true)
            {
                
//Console.WriteLine("等待联入");
                if ((client = serverSocket.Accept()) != null)
                {
                    Console.WriteLine(
"客户已连接,发送数据中");
                    
byte[] msg = { 10203040};//定义发送的数据
                    Console.WriteLine("总计将发送:" + client.Send(msg) + "个字节数");//同时将数据Send出去
                    Console.WriteLine("结束");
                    Console.ReadLine();
                    client.Close();
                    
break;
                }
            }
        }
    }
}

 

代码基本同客户端,只是多了一个client套接字,他用于和客户端打交道,而serverSocket则是用于储存服务器自己的信息,并且把连接到服务器的客户端套接字传递给client的中间站。大致流程同客户端,相信大家已经明白。

之后,我们先启动WM5模拟器,也就是文中开头你配置的那个模拟器,先把PPC程序“部署”过去,然后设置解决方案中的服务器端(控制台程序)为启动项目,ok,运行一下吧。

1、服务器端启动,等待联入:

2、启动PPC客户端,点击“连接服务器”按钮后,进行数据交换,服务器则显示发送状态:

 

OK,到这里,一个简单的PPC到PC端的TCP通讯就完成了,当然,说简单,是因为这里很多东西没有考虑到,如:多客户端的链接,多线程的使用,以及异步操作处理等高级内容。我会找个时间,和大家一起探讨一下相关技术。今天就写到这里吧。

PS:今天全国降温,春城从春天一下被打回冬天~~~冷啊~~~

相关文章:

  • 天音控股荣获“金圆桌”两项大奖
  • Rsync同步文件
  • 几种重要的网络演化模型
  • 一名2018应届生的全栈之路 | 掘金年度征文
  • android:focusableInTouchMode和android:focusable的意思用途
  • JAVA并发编程--1.基础概念
  • Amino—结构层
  • 使用双拼的好处
  • swift开发常用代码片段
  • 五分钟了解身体作息规律
  • jzoj6003. 【THUWC2019模拟2019.1.16】Square (乱搞)
  • MongoDB 之pymongodb
  • Web安全小攻略 | Web高能短文系列
  • 淘淘商城的一些错误
  • SpringBoot2.x升级后的变化
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [Vue CLI 3] 配置解析之 css.extract
  • echarts花样作死的坑
  • ES6--对象的扩展
  • fetch 从初识到应用
  • HTML-表单
  • java概述
  • node学习系列之简单文件上传
  • 闭包--闭包作用之保存(一)
  • 对JS继承的一点思考
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 构建二叉树进行数值数组的去重及优化
  • 基于游标的分页接口实现
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 什么软件可以提取视频中的音频制作成手机铃声
  • Python 之网络式编程
  • 积累各种好的链接
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​MySQL主从复制一致性检测
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • (day6) 319. 灯泡开关
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)【Hibernate总结系列】使用举例
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET MVC 验证码
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET中统一的存储过程调用方法(收藏)
  • @Conditional注解详解
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ Linux ] Linux信号概述 信号的产生
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [C++]STL之map
  • [CISCN2019 华东南赛区]Web4