TCP和UDP Client 代码

最近学习要求做网络编程,使用从网上找了一些资料,主要是网络协议的分层等通讯,你可以查看英文版的资料:CScharp网络编程英文版

下面直接给出代码吧,我想一看应该就懂。

TCP Client 代码:


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

namespace TcpLib
{
public class TcpClient
{

public TcpClient()
{
mSAEA.SetBuffer(new byte[1024 * 8], 0, 1024 * 8);
mSAEA.Completed += Receive_Completed;
}

private bool mConnected = false;

private Socket mSocket;

private Exception mLastError;

private SocketAsyncEventArgs mSAEA = new SocketAsyncEventArgs();

public void DisConnect()
{
mConnected = false;
try
{
if (mSocket != null)
{
mSocket.Close();

}
}
catch
{
}
mSocket = null;
}

private void Receive_Completed(object sender, SocketAsyncEventArgs e)
{
try
{
if (e.SocketError == SocketError.Success && e.BytesTransferred > 0)
{
TcpReceiveArgs tra = new TcpReceiveArgs();
tra.Data = e.Buffer;
tra.Offset = 0;
tra.Count = e.BytesTransferred;
OnReceive(tra);
}
else
{
mLastError = new SocketException((int)e.SocketError);
DisConnect();
}
}
catch (Exception e_)
{
mLastError = e_;
}
finally
{
BeginReceive();
}
}

private void BeginReceive()
{
try
{

if (!mSocket.ReceiveAsync(mSAEA))
{
Receive_Completed(this, mSAEA);
}
}
catch (Exception e_)
{
DisConnect();
mLastError = e_;
}

}

protected virtual void OnReceive(TcpReceiveArgs e)
{
e.Client = this;
if (Receive != null)
Receive(this, e);
}

public event EventHandler<TcpReceiveArgs> Receive;

public Exception LastError
{
get
{
return mLastError;
}
}

public Socket Socket
{
get
{
return mSocket;
}

}

public bool Connected
{
get
{
return mConnected;
}
}

public void Connect(string host, int port)
{
IPAddress[] ips = Dns.GetHostAddresses(host);
if(ips.Length ==0)
throw new Exception("get host‘s IPAddress error");
var address = ips[0];
try
{
mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
mSocket.Connect(address, port);
mConnected = true;
BeginReceive();
}
catch (Exception e_)
{
DisConnect();
mLastError = e_;
throw e_;
}
}

public void Send(string value)
{
Send(value, Encoding.UTF8);
}

public void Send(string value, Encoding coding)
{
Send(coding.GetBytes(value));
}

public void Send(byte[] data)
{
Send(data, 0, data.Length);
}

public void Send(byte[] data, int offset, int count)
{
try
{

while (count > 0)
{
int sends = mSocket.Send(data, offset, count, SocketFlags.None);
count -= sends;
offset += sends;
}
}
catch (Exception e_)
{
DisConnect();
mLastError = e_;
throw e_;
}
}

public void Send(ArraySegment<byte> data)
{
Send(data.Array, data.Offset, data.Count);

}

}

public class TcpReceiveArgs : EventArgs
{
public TcpClient Client
{
get;
internal set;
}

public byte[] Data
{
get;
internal set;
}

public int Offset
{
get;
internal set;
}

public int Count
{
get;
internal set;
}

public byte[] ToArray()
{
byte[] result = new byte[Count];
Buffer.BlockCopy(Data, Offset, result, 0, Count);
return result;
}

public void CopyTo(byte[] data, int start = 0)
{
Buffer.BlockCopy(Data, Offset, data, start, Count);
}
}

}

UDP Client 代码:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace UdpLib
{
public class UdpClient
{
public UdpClient(string host, int port)
{
mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
if (string.IsNullOrEmpty(host))
mSocket.Bind(new IPEndPoint(IPAddress.Any, port));
else
mSocket.Bind(new IPEndPoint(IPAddress.Parse(host), port));
mReceiveSAEA.Completed += OnReceiveCompleted;
mReceiveSAEA.SetBuffer(new byte[1024 * 64], 0, 1024 * 64);
BeginReceive();
}

private Exception mLastError;

private SocketAsyncEventArgs mReceiveSAEA = new SocketAsyncEventArgs();

private Socket mSocket;

private void OnReceiveCompleted(object sender, SocketAsyncEventArgs e)
{
try
{
if (e.SocketError == SocketError.Success && e.BytesTransferred > 0)
{
UdpReceiveArgs ura = new UdpReceiveArgs();
ura.EndPoint = e.RemoteEndPoint;
ura.Data = e.Buffer;
ura.Offset = 0;
ura.Count = e.BytesTransferred;
OnReceive(ura);
}
}
catch (Exception e_)
{
mLastError = e_;
}
finally
{

BeginReceive();
}
}

private void BeginReceive()
{
IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);

mReceiveSAEA.RemoteEndPoint = endpoint;
if (!mSocket.ReceiveFromAsync(mReceiveSAEA))
{
OnReceiveCompleted(this, mReceiveSAEA);
}
}

protected virtual void OnReceive(UdpReceiveArgs e)
{
if (Receive != null)
Receive(this, e);
}

public Exception LastError
{
get
{
return mLastError;
}
}

public void Send(string data, string host, int port)
{
Send(data, new IPEndPoint(IPAddress.Parse(host), port));
}

public void Send(byte[] data, string host, int port)
{
Send(data, new IPEndPoint(IPAddress.Parse(host), port));
}

public void Send(byte[] data, EndPoint point)
{
Send(data, 0, data.Length, point);
}
public void Send(byte[] data,int offset,int count, EndPoint point)
{
while (count > 0)
{
int sends = mSocket.SendTo(data, offset, count, SocketFlags.None, point);
count -= sends;
offset += sends;
}
}
public void Send(string data, EndPoint point)
{
Send(Encoding.UTF8.GetBytes(data), point);
}

public event EventHandler<UdpReceiveArgs> Receive;

}

public class UdpReceiveArgs : EventArgs
{

public EndPoint EndPoint
{
get;
internal set;
}

public byte[] Data
{
get;
internal set;
}

public int Offset
{
get;
internal set;
}

public int Count
{
get;
internal set;
}
public byte[] ToArray()
{
byte[] result = new byte[Count];
Buffer.BlockCopy(Data, Offset, result, 0, Count);
return result;
}

public void CopyTo(byte[] data, int start = 0)
{
Buffer.BlockCopy(Data, Offset, data, start, Count);
}
}

}

TCP和UDP Client 代码

时间: 2024-10-29 09:41:20

TCP和UDP Client 代码的相关文章

1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client

 1  Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端口号"就称为socket. 在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成的socket pair就唯一标识一个连接.socket本身有"插座"的意思,因此用来描述网络连 接的一对一关系. TCP/IP协议最早在BSD UNIX上实现,

Qt浅谈之十六:TCP和UDP(之一)

一.简介 Qt使用QtNetwork模块来进行网络编程,提供了一层统一的套接字抽象用于编写不同层次的网络程序,避免了应用套接字进行网络编的繁琐(因有时需引用底层操作系统的相关数据结构).有较底层次的类如QTcpSocket.QTcpServer和QUdpSocket等来表示低层的网络概念:还有高层次的类如QNetworkRequest.QNetworkReply和QNetworkAccessManager使用相同的协议来执行网络操作:也提供了QNetworkConfiguration.QNetw

Linux网络编程8&mdash;&mdash;对TCP与UDP的简易封装

引言 每次使用socket通信,都会有很对相似的操作.本文,会对TCP与UDP通信做一简单封装,并生成动态库. 代码 my_socket.h #ifndef __MY_SOCKET_H__ #define __MY_SOCKET_H__ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #in

Java Socket实现基于TCP和UDP多线程通信

一.通过Socket实现TCP编程 1.1 TCP编程 TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据.基于TCP协议实现网络通信的类有客户端的Socket类和服务器端的ServerSocket类. 1.2 服务器端套路 1.创建ServerSocket对象,绑定监听端口. 2.通过accept()方法监听客户端请求. 3.连接建立后,通过输入流读取客户端发送的请求信息. 4.通过输出流向客户端发送响应信息. 5.关闭响应的资源. 1.3 客户端套路 1.创建Socket对象,指明

[python] 网络编程之套接字Socket、TCP和UDP通信实例

很早以前研究过C#和C++的网络通信,参考我的文章: C#网络编程之Tcp实现客户端和服务器聊天 C#网络编程之套接字编程基础知识 C#网络编程之使用Socket类Send.Receive方法的同步通讯 Python网络编程也类似.同时最近找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. 最后希望文章对你有所帮助,如果有不

Android中实现TCP和UDP传输实例

TCP和UDP在网络传输中非常重要,在Android开发中同样重要. 首先我们来看一下什么是TCP和UDP. 什么是TCP? TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的.可靠的.基于字节流的运输层(Transport layer)通信协议,由IETF的RFC 793说明(specified).在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能.应用层向TCP层发送用于网间传输的.用8位字节表示的数据流,然后TCP

高性能 TCP &amp;amp; UDP 通信框架 HP-Socket v3.2.2 正式公布

HP-Socket 是一套通用的高性能 TCP/UDP 通信框架.包括服务端组件.client组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Delphi.E(易语言).Java.Python 等编程语言接口.HP-Socket 对通信层实现全然封装.应用程序不必关注通信层的不论什么细节:HP-Socket 提供基于事件通知模型的 API 接口,能很easy高效地整合到新旧应用程序中. 为了让使用者能方便高速地学习和使用 HP-Socke

android TCP 和 UDP总结(转)

之前写过一些关于TCP和UDP数据传输的代码,比如使用TCP传输音视频数据包,P2P打洞中使用UDP等.写好之后就直接丢下了,没有总结下都.最近准备找工作,再拿来温习下. 1.还是先说点啥 暂时把自己的定位很明确,就是android应用层的开发,所以关于TCP/UDP的实现细节,暂时也不想去深究.但是心里清楚这个必须去看的,有时间推荐大家看看<TCP/IP详解>,或者网上有很多大牛的总结. 2.TCP 不知道为什么,这个总结不想写的太细,不贴代码写的细又不知道能总结啥,好纠结,可能就是认识有限

TCP、UDP练习题 (UDP聊天程序、TCP上传文本文件和图片文件)

TCP.UDP编程练习 TCP ☆上传文本文件 读取一个本地文本文件,将数据发送到服务端,服务器端对数据进行存储. 存储完毕后,给客户端一个提示. 一.解题思路 客户端:(1) 创建Socket对象----用服务器的ip+端口号 (2)读取文件内容 (3)通过socket把内容发送给服务器端(把socket中的输出流包装成"打印流"来进行发送文本,是一种比较安全的输出方式,不会出现失真.) 服务器端:(1) 创建服务器socket---ServerSocket (2)通过ServerS