TCP通信(一)——同步连接

这篇博客主要包含两个部分的内容:一个是服务端的代码,一个是客户端的代码。
一、服务端类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;

namespace TCPServer
{
    class Program
    {
        private const int portNum = 1999;
        static void Main(string[] args)
        {
            TcpListener listener = new TcpListener(IPAddress.Any, portNum);
            listener.Start();
            bool isDone = false;
            while(!isDone)
            {
                TcpClient client = listener.AcceptTcpClient();
                if(client!=null)
                {
                    NetworkStream stream = client.GetStream();
                    byte[] bytes = Encoding.ASCII.GetBytes(DateTime.Now.ToString());
                    try
                    {
                        stream.Write(bytes, 0, bytes.Length);
                        stream.Close();
                        client.Close();
                    }
                    catch(Exception e)
                    {
                        Console.WriteLine(e.ToString());
                    }
                }
            }
            listener.Stop();
        }
    }
}

服务端代码说明:
1、端口号,即告诉客户端我哪间屋子是敞开的。关于这句代码,还是要多说几句的:

TcpListener listener = new TcpListener(IPAddress.Any, portNum);

IPAddress.Any是代表任意地址的意思,即:0.0.0.0
IPAddresss.Loop是代表本机,也就是:127.0.0.1
所以这个构造函数的意思是,要传递一个ip地址,以及以端口号。早期的C#提供的API,只需要端口号,但是已经标记过时了。所以,你这里既可以填写本机地址,也可以填写某个特定的IP。比如192.168.1.123等等,如果是字符串的话,那么则需要用下面的函数转换一下。

TcpListener listener = new TcpListener(IPAddress.Parse("191.168.1.123"),portNum);

这样就可以了。
2、然后开始监听:
这里写图片描述
3、循环监听是否有客户端连接进来。故有一个while死循环。
4、当有一个客户端连接的时候,则后去流,然后向管道中写入当前系统时间,紧接着就关闭连接。

二、客户端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Text;

namespace TCPClient
{
    class Program
    {
        private const string hostName = "127.0.0.1";
        private const int portNum = 1999;
        static void Main(string[] args)
        {
            try
            {
                TcpClient client = new TcpClient(hostName, portNum);
                NetworkStream stream = client.GetStream();
                byte[] bytes = new byte[1024];
                int bytesRead = stream.Read(bytes, 0, bytes.Length);
                Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytes.Length));
                client.Close();
            }
            catch(Exception e)
            {
                Console.WriteLine("网络异常!");
            }
        }
    }
}

客户端代码说明:
1、首先指定要连接的服务器的地址和端口,建立连接。
2、然后获取流,读取服务端传过来的字节。

运行说明:
1、先运行服务端,然后运行客户端,你会发现客户端程序的控制台窗口,收到了,一个日期字符串。

扩展:
关于windows下的端口监听查看,我们可以使用如下的命令:netstat -ano命令。
这里写图片描述

over!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.net 稳定 高效 易用 可同步 TCP 通信框架 使用平台: WinXP,WIN7,WIN8,WINCE,WINPHONE。 使用.net 2.0 框架。 主要功能介绍: 1、可以代替 Oracle,Mysql客户端 在不安装Oracle,MySql客户端的情况下访问, 对数据库进行间接访问(需开始框架的服务器端)。 2、可以使本来没有网经功能的Sqlite具有网络访问的能力。(也是需要开启服务器端) 以上两点可以兼容现有代码生成器时,客户端代码仅需要特别小的改动就可以。 3、基本功能。可以实现聊天,传文件,图片。 4、使用长连接,有断线自动连接功能,心跳包。 5、使用自定义数据包协议,自建Session机制加强数据连接安全。 6、框架稳定,支持高并发。 7、简单的事件处理机制。使用更加简单。 8、支持同步处理,使程序的开发更架简单,不需要另行回调处理。 下载地址: 使用方式: 首选需要 引用 DataUtils.v1.1.dll。DataUtils 内包含客户端与服务器端 处理类。 1、服务器端 代码示例。 设置服务器端默认端口 ,不设置端口会使用默认端口 TcpSettings.DefultPort = 8511; 既可以使用静态默认对象,也可以创建服务器端对象。 SocketListener server= new SocketListener(); 对象创建后 注册一些事件,以接收客户端发送的信息。 SocketListener.Server.RegeditSession += new Feng.Net.Tcp.SocketListener.RegeditSessionEventHandler(server_RegeditSession); RegeditSession 事件用于是否允许客户端连接此服务器。可以使用用户名,密码的核对方式。 SocketListener.Server.DataReceive += new SocketListener.DataReceiveEventHandler(server_DataReceive); DataReceive 在这个事件里处理接收到的数据。 事件注册完成就可以打开监听 SocketListener.Server.StartListening(); 2、客户端 代码示例 设置服务器的IP地址 TcpSettings.DeafultIPAddress = "192.168.1.3"; TcpSettings.DefultPort = 8511;//不设置端口会使用默认端口。 这样就可以使用默认的静态客户端了。 也可以自己创建对象。 客户端创建后需要在Connected事件注册用户,以限制某些用户是否可以使此链接。用户来源可以是数据库等。 void client_Connected(object sender, SocketClient sh) { Client.RegeditSession("aaa", "bbb"); } 发送文字消息给其他用户 SocketClient.Client.SendToOtherUser(string user, string text); //USER代表发达的目白用户,text表示为发送的内容。 发送图片,音频,视屏可以使用 SocketClient..SendToOtherUser(string user, byte[] data)////USER代表发达的目白用户,data表示为发送的内容。 data数据中数据有多种类型时可以使用 using (Feng.IO.BufferWriter bw = new Feng.IO.BufferWriter()) { bw.WriteBitmap(new Bitmap(100, 100)); bw.Write(text);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值