基于C#的Socket
来源:互联网 发布:怪物猎人ol匠加成数据 编辑:程序博客网 时间:2024/05/18 20:36
首先从原理上解释一下采用Socket接口的网络通讯,这里以最常用的C/S模式作为范例,首先,服务端有一个进程(或多个进程)在指定的端口等待客户来连接,服务程序等待客户的连接信息,一旦连接上之后,就可以按设计的数据交换方法和
需要知道的是:Socket类支持两种基本模式:同步和异步。其区别在于:在同步模式中,按块传输,对执行网络操作的函数(如Send和 Receive)的调用一直等到所有内容传送操作完成后才将控制返回给调用程序。在异步模式中,是按位传输,需要指定发送的开始和结束。同步模式是最常用的模式。
SocketServer:服务端
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace SocketServer
{
public class Server
{
static void Main(string[] args)
{
try
{
int port = 2000;
//string host = "127.0.0.1";
//服务端的IP可以设置成“0”
string host = "0";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
//创建一个Socket类
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定2000端口
socket.Bind(ipe);
//开始监听
socket.Listen(0);
while (true)
{
Console.WriteLine("Wait for connect");
//为新建连接创建新的Socket。
Socket temp = socket.Accept();
Console.WriteLine("Get a connect");
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
//从客户端接受信息
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
//把客户端传来的信息显示出来
Console.WriteLine("Server Get Message:{0}", recvStr);
string sendStr = "Ok! Client Send Message Sucessful!";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
//返回客户端成功信息
temp.Send(bs, bs.Length, 0);
temp.Close();
}
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException:{0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException:{0}", e);
}
}
}
}
SocketClient:客户端
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace SocketClient
{
public class Client
{
static void Main(string[] args)
{
try
{
int port = 2000;
string host = "127.0.0.1";
//string host = "192.168.6.119";
IPAddress ip = IPAddress.Parse(host);
//把ip和端口转化为IPEndPoint实例
IPEndPoint ipe = new IPEndPoint(ip, port);
for (int i = 0; i < 10; i++)
{
//创建一个Socket
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine("Conneting...");
//连接到服务器
socket.Connect(ipe);
//string sendStr = "hello!This is a socket test";
string sendStr = "Hello!This is a Socket Test!";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
Console.WriteLine("Send Message");
//发送测试信息
socket.Send(bs, bs.Length, 0);
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
//从服务器端接受返回信息
bytes = socket.Receive(recvBytes, recvBytes.Length, 0);
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
//显示服务器返回信息
Console.WriteLine("Client Get Message:{0}", recvStr);
socket.Close();
}
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException:{0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException:{0}", e);
}
Console.WriteLine("Press Enter to Exit");
Console.ReadLine();
}
}
}
上面的例子是用的Socket类,System.Net.Socket命名空间还提供了两个抽象高级类TCPClient和UDPClient和用于通讯流处理的NetWorkStream
客户端
TcpClienttcpClient=newTcpCLient(主机IP,端口号);
NetworkStreamns=tcp.Client.GetStream();
服务端
TcpListenertcpListener=newTcpListener(监听端口);
tcpListener.Start();
TcpClienttcpClient=tcpListener.AcceptTcpClient();
NetworkStreamns=tcpClient.GetStream();
服务端用TcpListener监听,然后把连接的对象实例化为一个TcpClient,调用TcpClient.GetStream()方法,返回网络流实例化为一个NetworlStream流,下面就是用流的方法进行Send,Receive
如果是UdpClient的话,就直接UdpClient实例化,然后调用UdpClient的Send和Receive方法,需要注意的事,UdpClient没有返回网络流的方法,就是说没有GetStream方法,所以无法流化,而且使用Udp通信的时候,不要服务器监听。
- 基于C#的Socket
- 基于C#的Socket开发
- 基于C#的Socket入门
- 基于C#的Socket开发快速入门
- 基于C#的Socket开发快速入门
- C#基于TCP的Socket通信
- 基于C#的Socket开发快速入门
- C#基于socket的聊天工具与其源码
- C#基于socket的聊天工具与其源码
- [转]基于C#的Socket简单通讯
- 基于C#的Socket简单通讯
- C#基于TCP的Socket通信
- 基于C#的UDP socket 通信
- C#基于Socket的简单聊天室实践
- 基于C#的socket编程的TCP异步实现
- 基于C#的socket编程的TCP异步实现
- 基于C#的socket编程的TCP异步实现
- 基于C#的socket编程的TCP同步实现
- PE46
- Google Chrome 5浏览器闪亮登场 HTML5支持大大增强
- 近来维护一个项目,里面用的CUJ里的代码,想下来看看。。本来面目。找了半天。
- 傅盛揭360拦截事件老底:怒斥对方毁坏行业zt
- 搞搞QT3:字符串和数字
- 基于C#的Socket
- 嘿
- Android杂记
- you are not a superman!
- Android的多媒体框架OpenCore介绍
- 构建自己的不可替代性
- DataGridView绑定製作主從表
- Struts2整合EJB3
- C++中函数指针数组的使用