c#怎样才能实现客户端通过服务器端连接数据库服务器???

author author     2023-03-19     126

关键词:

各位大虾,小弟初学c#想完成一个简单的C/S程式,但发现很多实例都是通过客户端直接连接数据库,请问需要怎样才能实现 客户端通过服务器端连接数据库服务器???
实现逻辑:
客户端------服务器sever-------数据库sever
希望能够提供出示例。
请帮忙提供出具体实例代码或下载地址。

可以处理的,步骤为:
1.客户端与服务器连(用Socket通讯)
2.客户端向处服务器发送SQL语句,如搜索一个表的数据
3.服务器接到请求,执行SQL语句返回一个DataTable
4.服务器将这个DataTable进行序列化、并且压缩
5.服务器将【序列化和压缩】后的byte[] msg数组传给客户端
6.客户端收到byte[] msg数组先进行解压缩、和反序列化为DataTable
7.再将DataTable通过DataSet和SqlDataAdapter.Update(Table)存在SQL中
下面我只给一些关键的代码,我有实现过的

第一步.客户端==》连接服务器并通讯,主要是发送SQL给服务器返回一个DataTable表
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.IO.Compression;

namespace Client

public partial class FormClient : Form

DataTable dt;
public FormClient()

InitializeComponent();


private void ClientTest(string str)

Socket client;
String returnData;
byte[] buf = new byte[9991024]; //此处可能有些问题
//IPAddress local = IPAddress.Parse("116.25.83.127");
IPAddress local = IPAddress.Parse("127.0.0.1");//可改为远程IP地址
IPEndPoint iep = new IPEndPoint(local, 6060);
try

client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(iep);

catch (SocketException)

Console.WriteLine("无法连接到服务器!");
return ;


//输入exit,可以断开与服务器的连接
if (str == "")

return;

//发送SQL语句给服务器
client.Send(Encoding.Unicode.GetBytes(str));

//得到实际收到的字节总数
Int32 rec = client.Receive(buf);
Console.WriteLine(Encoding.ASCII.GetString(buf, 0, rec));
//接收服务器返回的数据
returnData = System.Text.Encoding.Unicode.GetString(buf,0,rec);

//将returnData解压缩后,再反序列化转成DataTable dt = DeserializerDataTable(Decompress(returnData));
Console.WriteLine("断开与服务器的连接......");
client.Close();
dataGridView1.DataSource = dt;


//将DataTable表反序列化
private DataTable DeserializerDataTable(string pXml)

StringReader strReader = new StringReader(pXml);
XmlReader xmlReader = XmlReader.Create(strReader);
XmlSerializer serializer = new XmlSerializer(typeof(DataTable));
DataTable dt = serializer.Deserialize(xmlReader) as DataTable;

return dt;
//给服务器传SQL语句
private void buttonSearch_Click(object sender, EventArgs e)

string Sql = String.Format("Select top 0 * From Part Where CorpCode_='PT'", textBox1.Text.Trim()); ;
ClientTest(Sql);


#region 压缩和解压缩
public string Compress(string str)

byte[] buffer = Encoding.Unicode.GetBytes(str);
MemoryStream ms = new MemoryStream();
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))

zip.Write(buffer, 0, buffer.Length);

ms.Position = 0;
MemoryStream outStream = new MemoryStream();
byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);

byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String(gzBuffer);


//解压缩
public string Decompress(string compressedText)

byte[] gzBuffer = Convert.FromBase64String(compressedText);
using (MemoryStream ms = new MemoryStream())

int msgLength = BitConverter.ToInt32(gzBuffer, 0);
ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
byte[] buffer = new byte[msgLength];
ms.Position = 0;
using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))

zip.Read(buffer, 0, buffer.Length);

return Encoding.Unicode.GetString(buffer);



#endregion



第二步.服务器收到SQL语句执行,并回传一个表给客户端
服务器接到请求,执行SQL语句返回一个DataTable
服务器将这个DataTable进行序列化、并且压缩
服务器将【序列化和压缩】后的byte[] msg数组传给客户端

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets; //可以使用套接字
using System.Threading; //可以使用多线程
using System.Data.SqlClient;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.IO.Compression;

namespace AppServer

public partial class FormApp : Form

public FormApp()

InitializeComponent();

private void FormApp_Load(object sender, EventArgs e)

// AppService instance = new AppService();


private void buttonStartService_Click(object sender, EventArgs e)

AppService();


private Socket server;
private Socket client;
private void AppService()

/*
//本机IP
string name = Dns.GetHostName();
IPHostEntry host = Dns.GetHostByName(name);
IPAddress id= host.AddressList[0];
* */

//IPAddress local = IPAddress.Parse("192.168.0.100");
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 6060);
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 将套接字与本地终结点绑定
server.Bind(iep);
//在本地13000端口号上进行监听
server.Listen(10);
while (true)

// 得到包含客户端信息的套接字
client = server.Accept();
//创建消息服务线程对象ClientService方法委托给线程
Thread newthread = new Thread(new ThreadStart(ClientService));
// 启动消息服务线程
newthread.Start();


private Int32 i;
private void ClientService()

Socket s = client;
String data = null;
String returnData = null;
byte[] bytes = new byte[1024];

while ((i = s.Receive(bytes)) != 0)

//接收客户端的SQL
data = System.Text.Encoding.Unicode.GetString(bytes, 0, i);
//将接到的String 执行SQL返回表
DBAccess obj = new DBAccess(); //专门传给SQL的类相当于DBHELP
DataTable dt = obj.FillData(data, "TEST", 1);//执行SQL返回表

//将返回的表转为String,并将returnData压缩
returnData = obj.Compress(obj.SerializeDataTableXml(dt));
byte[] msg = System.Text.Encoding.Unicode.GetBytes(returnData);

// 发送数据表给客户端 s.Send(msg);
if ((i = s.Receive(bytes)) == 0)
continue;

//关闭套接字
s.Close();



//DBAccess的部份代码

class DBAccess

#region DataTable序列化与反序列化
public string SerializeDataTableXml(DataTable dt)

StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);
XmlSerializer serializer = new XmlSerializer(typeof(DataTable));
serializer.Serialize(writer, dt);
writer.Close();

return sb.ToString();
public DataTable DeserializerDataTable(string pXml)

StringReader strReader = new StringReader(pXml);
XmlReader xmlReader = XmlReader.Create(strReader);
XmlSerializer serializer = new XmlSerializer(typeof(DataTable));
DataTable dt = serializer.Deserialize(xmlReader) as DataTable;

return dt;
#endregion
#region 压缩和解压缩
public string Compress(string str)

byte[] buffer = Encoding.Unicode.GetBytes(str);
MemoryStream ms = new MemoryStream();
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))

zip.Write(buffer, 0, buffer.Length);

ms.Position = 0;
MemoryStream outStream = new MemoryStream();
byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);

byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String(gzBuffer);


public string Decompress(string compressedText)

byte[] gzBuffer = Convert.FromBase64String(compressedText);
using (MemoryStream ms = new MemoryStream())

int msgLength = BitConverter.ToInt32(gzBuffer, 0);
ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
byte[] buffer = new byte[msgLength];
ms.Position = 0;
using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))

zip.Read(buffer, 0, buffer.Length);

return Encoding.Unicode.GetString(buffer);



#endregion


第三步.调用DataSet和SqlDataAdapter.Update(Table)存在SQL中,这个是传入一个DataGridView ,可在客户端中使用保存(部份代码,没有连接SQL数据库的)
#region 公共保存DataGridView
public bool DataGridViewSave(DataTable table,string tableName,string CorpCode)

string Sql = String.Format("Select Top 0 * From 0 Where CorpCode_='1' ", tableName, CorpCode);
SqlDataAdapter sda = new SqlDataAdapter(this.CreateCommand(Sql, null, 1));
SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sda.Update(table);
this.Close();
return true;

#endregion
参考技术A 你这样的就输入分布式开发,现在流行的主要就是WCF,WebService,Remoting 服务端给出接口,客户端连接到服务器后,只需要调用服务器的方法,具体的业务操作,数据操作都是服务器来执行,如果初学建议去看下WebService相关知识,应该很容易上手本回答被提问者采纳 参考技术B 那就是服务器接口客户端的sql和参数,然后服务端执行sql,把得到的结果序列化后发送出去嘛
或者使用wcf功能
参考技术C 08 或之后的用wcf
像05的webservice、remoting
实例网上找找吧追问

沒有找到這方面的實例,能不能幫忙提供地址呢。

追答

你上msdn上找吧,里面好多教程的,你看你需要什么就找什么的,是在msdn的主页上,你上微软中国可以找到,找不到再MMM吧

参考技术D 最简单的是使用webservice

oracle11g怎样配置才能连接远程数据库

可以通过两种方法实现:1、安装oracle客户端,配置本地服务即可连接远程数据库。2、如果不安装oracle客户端,则需要下载instantclient,然后进行对应的配置,使用pl/sqldeveloper进行连接,具体配置你可以百度下,相关参考信息应该... 查看详情

通过socket实现tcp编程(代码片段)

...字节流的方式发送数据基于TCP协议实现网络通信的类  客户端的Socket类  服务器端的ServerSocket类 Socket通信实现步骤  1.创建ServerSocket和Socket  2.打开连接到Socket的输入、输出流  3.按照协议对Socket进行读/写操作 ... 查看详情

java中使用websocket推送消息服务器端怎么才能主动推送

...要实现消息实时推送,有两种方法,一种是ajax轮询,由客户端不停地请求服务器端,查询有没有新消息,然后再由服务器返回结果;另外一种就是longpoll,通过一次请求,询问服务器有没有新消息更新,如果没有新消息时,会保... 查看详情

delphioracle三层架构的服务端开发

...使用delphi2010开发ORACLE三层架构的服务端,为了省掉ORACLE客户端安装,使用unidac连接数据库,不使用unidac也可以,始终不明白服务器端要怎样才能接受客户端传来的SQL语句并返回结果给客户端参考技术A三层结构,客户端通过接口... 查看详情

vnc怎么设置访问地址,怎样连接?怎样操作?

...地址要怎么设置?参考技术A你知道服务器端的IP地址,和客户端号,然后知道服务器端vncserver的密码,就可以了。拿客户端号为1举例。如果是web连接的话就是服务器的ip地址:5801;如果是vncviewer连接的话,就是服务器ip地址:1... 查看详情

tcp通信

...socket对象。区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可... 查看详情

前端即时通信是怎么开发的?

...建立在HTTP协议基础上。在WebSocket连接建立后,服务器和客户端之间可以互相发送和接收数据,而无需进行多次HTTP请求。实现WebSocket连接:按照WebSocket协议的标准,客户端可以通过JavaScript代码创建WebSocket对象。在客户端上,通过... 查看详情

c#里实现简单的异步tcp服务器

...,解决简单的问题够用了。但是如果面对多个连接,多个客户端的处理,就不行了。这时候就要采用异步的TCP服务器,或者多任务,多线程的服务器。在这里采用了TcpListener来接收网络连接,采用TcpClient来与客户端进行通讯。由... 查看详情

c#里实现简单的异步tcp服务器

...,解决简单的问题够用了。但是如果面对多个连接,多个客户端的处理,就不行了。这时候就要采用异步的TCP服务器,或者多任务,多线程的服务器。在这里采用了TcpListener来接收网络连接,采用TcpClient来与客户端进行通讯。由... 查看详情

怎样连接redis数据库

Redis连接命令主要是用于连接redis服务。以下实例演示了客户端如何通过密码验证连接到redis服务,并检测服务是否在运行:redis127.0.0.1:6379>AUTH"password"OKredis127.0.0.1:6379>PINGPONG更多命令详见:http://www.apiref.com/redis-zh/136.html参考... 查看详情

tcp协议(代码片段)

...socket对象。区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可... 查看详情

c#基于udp实现简单客户端和服务器消息发送和接收(代码片段)

...录一、通过控制台直接发送数据1.创建新的C#控制台程序2.客户端代码3.服务器代码4.运行结果5.抓包分析二、通过可视化界面进行通信1.创建新的窗体应用2.窗口布局3.客户端核心代码4.运行结果5.抓包分析三、总结一、通过控制台... 查看详情

java中servlet页面怎样刷新session,使jsp页面得到即使更新????

...是还是不能更新session里面的值呀 参考技术B实现服务器和客户端异步数据一致的方法有两种通信方式:客户端定时请求服务器端的服务,B/S框架下使用html页面用js定时轮询(ajax方式后台请求),请求某个URI,访问servlet实现查询... 查看详情

socketcan的节点怎么获取

...送数据内容,直到双方断开连接。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致socket连接断连,因此... 查看详情

通过 c# 连接访问

...。在远程访问数据库的本地环境中运行良好。当我从生产服务器(其他服务器)运行此应用程序时,它会失败并显示消息"它已被其他用户独占打开,或者您需要权限才能查看其数据。"我的代码:conString=@"Provider=Microsoft.JET.OLEDB.4.... 查看详情

第3章tcp协议(代码片段)

...socket对象。区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据。而TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可... 查看详情

c#如何实现服务端发送对象到客户端

...好了一个学生类要把这个类发送到另外一台电脑上(就是客户端)怎么实现。。。求助啊C/S程序听说用序列化可以但是看了一下好像也只能在一台电脑上传递对象,(是传递对象不是文件)我要用此对象不是要数据如果可以... 查看详情

00106_tcp通信

...区别在于:    ①UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据;    ②TCP通信是严格区分客户端与服务器端的。  (3)在通信时,必须先由客户端去连接服务器端才能实现... 查看详情