1.目的:实现客户端向服务器发送数据

原理:

2.建立两个控制台应用,一个为服务器,用于接收数据。一个为客户端,用于发送数据。

关键类与对应方法:

1)类IPEndPoint:

1.是抽象类EndPoint的实现类

2.Socket对象的RemoteEndPoint、 LocalEndPoint都是这个类型

3.属性Address: 使用IPv4表示的地址

4.属性Port:使用int表示的端口

2)类Socket:

这个类即可以用于作服务器端的开发,又可以作客户端的开发

构造方法:

参数 AddressFamily:指定使用IPv4的地址InterNetwork

参数SocketType:指定使用流式传输Stream

参数ProtocolType:指定协议类型Tcp

1.方法Bind()E 绑定IP与端口,这样就成为了服务器,可以监听指定IP的特定端口

2.方法Listen(); 置于监听状态,参数是最大的挂起数

3.方法Accept(): 接收客户端连接,返回Socket对象, 这个方法会阻塞当前线程,建议开启新线程执行些方法,结合尾递归,这样就可以接收多个客户端

4.方法Receive(): 接收客户端发送过来的消息,以字节为单位进行操作,此方法会阻塞当前线程,建议开启新线程执行此方法,结合尾递归,就可以持续接收多条信息

5. 方法Send(): 发送消息,以字节为单位

3.具体实现

其他内容不做过多解释了,备注做的超详细,应该只有笨笨的人才写这么多备注吧。。

1.服务器

主函数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ServerTest
{
class Program
{
static void Main(string[] args)
{
// 调用构造函数,使用Start方法
ServerControl server = new ServerControl();
server.Start(); Console.ReadKey();
}
}
}

ServerControl类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ServerTest
{
public class ServerControl
{
// 声明变量(使用Socket需using System.Net.Sockets;)
private Socket serverSocket; // 自定义有参构造方法(IP地址,流程传输方式,TCP协议)
public ServerControl()
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
} // 创建启动方法(IPEndPoint用于指定地址及端口初始化,需using System.Net;)
public void Start()
{
// 服务器启动
// 绑定IP地址(为任意IP)与端口(设置为12345)
serverSocket.Bind(new IPEndPoint(IPAddress.Any,));
serverSocket.Listen();
Console.WriteLine("服务器启动成功"); // 开启线程:目的实现服务器和客户端一对多连接
Thread threadAccept = new Thread(Accept);
threadAccept.IsBackground = true;
threadAccept.Start();
}
// Accept方法测试:接收客户端连接
private void Accept()
{
// 接收客户端方法,会挂起当前线程(.RemoteEndPoint表示远程地址)
Socket client = serverSocket.Accept();
IPEndPoint point = client.RemoteEndPoint as IPEndPoint;
Console.WriteLine(point.Address + "[" + point.Port + "] 连接成功!"); // 开启一个新线程线程,实现消息多次接收
Thread threadReceive = new Thread(Receive);
threadReceive.IsBackground = true;
threadReceive.Start(client); // 尾递归
Accept();
} // Receive方法的使用测试
// 接收客户端发送过来的消息,以字节为单位进行操作
// 该方法会阻塞当前线程,所以适合开启新的线程使用该方法
// Accept()中将Receive作为线程传递对象,所以要注意一点,使用线程传递对象只能是object类型的!!
private void Receive(object obj)
{
// 将object类型强行转换成socket
Socket client = obj as Socket; IPEndPoint point = client.RemoteEndPoint as IPEndPoint; // 此处的异常抛出主要针对客户端异常的问题
// 比如,客户端关闭或者连接中断
// 程序会停留在int msgLen = client.Receive(msg);这段代码,而导致无法继续往下走
try
{
byte[] msg = new byte[];
// 实际接收到字节数组长度,该方法会阻塞当前线程,即(client.Receive(msg)开始挂起)
// 同时,这里还是尾递归挂起处
int msgLen = client.Receive(msg);
// 将msg装换成字符串
Console.WriteLine(point.Address + "[" + point.Port + "]:" + Encoding.UTF8.GetString(msg, , msgLen));
// 此处实现服务器自动向客户端返回一条消息
// 因为Send发送信息是以字节为单位发送的
// 所以下面(Encoding.UTF8.GetString(msg,0,msgLen)+" yes.boy")这一块是把这一部分均搞成string
// 后使用Encoding.UTF8.GetBytes统一转化成字节传递
// 这里呢,已经实现服务器向客户端发送消息了,客户端只需要receive一下,格式一转就可视化了
client.Send(Encoding.UTF8.GetBytes(Encoding.UTF8.GetString(msg,,msgLen)+" yes.boy"));
// 尾递归实现多条消息的接收;和while同理。
Receive(client);
}
catch
{
Console.WriteLine(point.Address + "[" + point.Port + "]积极断开");
}
}
}
}

2.客户端:

主函数:

client.Connect("127.0.0.1",12345);
修改IP可实现不同计算机之间的连接。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ClientTest
{
class Program
{
static void Main(string[] args)
{
// 调用构造函数
ClientControl client = new ClientControl();
// 输入本机IP与端口号
client.Connect("127.0.0.1",);
// 提示操作方法
Console.WriteLine("请输入发送至服务器的内容或者输入quit退出");
// 输入内容
string msg = Console.ReadLine();
// 非退出情况下操作方式,使用while可以持续不断的接收用户输入
while(msg != "quit")
{
client.Send(msg);
msg = Console.ReadLine();
} Console.ReadKey();
}
}
}

ClientControl类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ClientTest
{
public class ClientControl
{
// 声明变量
private Socket clientSocket; // 自定义有参构造方法((IP地址,流程传输方式,TCP协议))
public ClientControl()
{
clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
} // 创建通过IP与端口号连接的方法
public void Connect(string ip,int port)
{
clientSocket.Connect(ip, port);
Console.WriteLine("连接服务器成功"); // 客户端接收服务器消息的线程
Thread threadReceive = new Thread(Receive);
threadReceive.IsBackground = true;
threadReceive.Start();
} // 用于测试服务器向客户端返回一条消息
private void Receive()
{
while(true)
{
try
{
// 用于接收服务器的回复信息
byte[] msg = new byte[];
int msgLen = clientSocket.Receive(msg);
Console.WriteLine("服务器:"+Encoding.UTF8.GetString(msg,,msgLen));
}
// 异常处理方法
catch
{
Console.WriteLine("服务器积极拒绝!!");
// 退出while循环
break;
}
}
} // Send方法测试:即发送消息,以字节为单位
public void Send(string msg)
{
// 将字符创传化为字节数组
clientSocket.Send(Encoding.UTF8.GetBytes(msg));
}
}
}

4.实现

本地连接:IP为127.0.0.1

远程连接:因为我只有一台电脑,所以用腾讯云服务器作为我的服务器,我本地的PC作为客户端,实现连接。

1.修改客户端主程序里面的IP为我的腾讯云IP

2.使用远程桌面连接

3.连接成功

一个基于TCP/IP的服务器与客户端通讯的小项目(超详细版)的更多相关文章

  1. 一个基于TCP/IP的小项目,实现广播消息的功能。(超详细版)

    1.结合现状 功能分析 该功能基于上个项目的改进,主要是通过对服务器端代码的修改,以及对客户端作少许修改,实现开启多客户端时,一个客户端发送消息,达到对所有客户端广播的效果.可参考网吧里的点歌系统,比 ...

  2. java实例练习——基于TCP/IP协议的多客户端通信

    先说一下大概的思路: 应用多线程来实现服务器与多客户端之间的通信 1.服务器端创建ServerSocket,循环调用accept()等待客户端连接: 2.客户端创建一个Socket并请求与服务器端连接 ...

  3. 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发

    ''' 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发 ''' client import socket import time client = socket.socket() clie ...

  4. 基于TCP/IP协议的C++网络编程(API函数版)

    源代码:http://download.csdn.net/detail/nuptboyzhb/4169959 基于TCP/IP协议的网络编程 定义变量——获得WINSOCK版本——加载WINSOCK库 ...

  5. 基于TCP的安卓服务器开发

    一.说明 前文介绍了基于安卓客户端的开发,在此基础上,进行少许改动即可开发出一款基于TCP的安卓服务器,理论知识请参见笔者上一篇博文,下面直接实践操作. 二.权限申明 <!--允许应用程序改变网 ...

  6. JAVA Socket 底层是怎样基于TCP/IP 实现的???

    首先必须明确:TCP/IP模型中有四层结构:       应用层(Application Layer).传输层(Transport  Layer).网络层(Internet Layer  ).链路层( ...

  7. 基于SignalR的服务端和客户端通讯处理

    SignalR是一个.NET Core/.NET Framework的实时通讯的框架,一般应用在ASP.NET上,当然也可以应用在Winform上实现服务端和客户端的消息通讯,本篇随笔主要基于Sign ...

  8. mqtt 服务器与客户端通讯

    mqtt 服务器与客户端通讯. 服务器端 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...

  9. 20181225 基于TCP/IP和基于UDP/IP的套接字编程

    一.TCP/IP的套接字编程 服务器端代码: import  socket​server = socket.socket() # 默认是基于TCP# 基于TCP的对象serve=socket.sock ...

随机推荐

  1. POJ 1966:Cable TV Network(最小点割集)***

    http://poj.org/problem?id=1966 题意:给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. 思路:将点i拆成a和b,连一条a-&g ...

  2. Oracle数据库---包

    --根据员工号或员工姓名获取员工的信息--根据员工号或员工姓名删除员工的信息--创建包规范CREATE OR REPLACE PACKAGE overload_pkgIS FUNCTION get_i ...

  3. 小程序组件-swipe多页切换,并支持下拉刷新,上拉加载,menu动态联动切换

    前言 最近一个小程序项目中遇到一个需求,就是实现类似资讯类app的多页面切换的那种效果, 如下图: 最终效果: 1.功能分析 首先实现这个功能分为三步: 实现顶部menu菜单 实现多页面滑动切换 支持 ...

  4. 嵊州D3T3 light

    嵊州D3T3 light 光恰似水 兄弟俩曾经 k 次受到过父母的物质激励. 一开始,兄弟俩的能力值为 1,最后,兄弟俩的能力值是 1 + (2 ^k−1)/ n . 当兄弟俩受到价值为 mi 的物质 ...

  5. c++学习书籍推荐《深入理解C++11 C++11新特性解析与应用》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <深入理解C++11:C++11新特性解析与应用>编辑推荐:C++标准委员会成员和IBM XL编译器中国开发团队共同撰写,权威性毋庸置疑.系统.深 ...

  6. [ZJOI2008]杀蚂蚁antbuster 题解

    一个题目的可读版本:https://www.zybuluo.com/Jerusalem/note/221811 这两天做的又一道大模拟题,感觉这玩意有毒,会上瘾啊…… 比起猪国杀这道题真心不知道高到哪 ...

  7. [Haoi2016]字符合并 题解

    tijie 时间限制: 2 Sec  内存限制: 256 MB 题目描述 有一个长度为 n 的 01 串,你可以每次将相邻的 k 个字符合并,得到一个新的字符并获得一定分数.得到的新字 符和分数由这 ...

  8. 微信小程序开发--API界面交互

    一.wx:showActionSheet(上拉菜单) 属性 类型 默认值 必填 说明 itemList Array.<string>   是 按钮的文字数组,数组长度最大为 6 itemC ...

  9. Hadoop现在怎么样了?

    之前我们提到大数据的时候就会提到Hadoop,Hadoop是大数据的基础框架,是大数据技术的代表.提到HDFS.MapReduce.Yarn,提到HBase.Hive.TEZ等Hadoop生态圈中的一 ...

  10. JavaScript函数及闭包

    前面一片文章讲到过一点函数,了解到每声明一个函数就会产生一个作用域.而外面的作用域访问不了里面的作用域(把里面的变量和函数隐藏起来),而里面的可以访问到外面的.对于隐藏变量和函数是一个非常有用的技术. ...