① C# 怎樣才能實現客戶端通過伺服器端連接資料庫伺服器
可以處理的,步驟為:
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
② C/S系統客戶端如何與伺服器連接
一般是連接資料庫伺服器,以連接SQLSERVER為例,需要NEW一個SQLConnect,然後賦值連接參數,最後打開這個連接就好了。
連接參數示例如下:
Provider=SQLOLEDB.1; #連接資料庫的驅動程序,SQL Server是 SQLOLEDB.1
Password="******"; #登錄口令
User ID=sa; #登錄ID
Initial Catalog=xxxxxx; #資料庫名稱
Data Source=192.168.10.2 #SQLSERVER伺服器名或IP地址
③ 客戶端與伺服器端的通訊,C++書寫步驟。
C++通過socket編程實現服務端與客戶端的通訊,代碼如下(個人環境下測試正常,如果遇到運行send發送報錯,請檢查伺服器埠是否被佔用,調試的時候請先運行服務端程序在運行客服端,一定要載入庫函數ws2_32.lib,發送字元時應該多加一個空字元作為結束字元):
伺服器端程序:
//Server.cpp:.
#include"winsock2.h"
#pragmacomment(lib,"ws2_32.lib")
#include<iostream>
usingnamespacestd;
intmain(intargc,char*argv[])
{
constintBUF_SIZE=64;
WSADATAwsd;//WSADATA變數
SOCKETsServer;//伺服器套接字
SOCKETsClient;//客戶端套接字
SOCKADDR_INaddrServ;;//伺服器地址
charbuf[BUF_SIZE];//接收數據緩沖區
charsendBuf[BUF_SIZE];//返回給客戶端得數據
intretVal;//返回值
//初始化套結字動態庫
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
cout<<"WSAStartupfailed!"<<endl;
return1;
}
//創建套接字
sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sServer)
{
cout<<"socketfailed!"<<endl;
WSACleanup();//釋放套接字資源;
return-1;
}
//伺服器套接字地址
addrServ.sin_family=AF_INET;
addrServ.sin_port=htons(4999);
addrServ.sin_addr.s_addr=INADDR_ANY;
//綁定套接字
retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
if(SOCKET_ERROR==retVal)
{
cout<<"bindfailed!"<<endl;
closesocket(sServer);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}
//開始監聽
retVal=listen(sServer,1);
if(SOCKET_ERROR==retVal)
{
cout<<"listenfailed!"<<endl;
closesocket(sServer);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}
//接受客戶端請求
sockaddr_inaddrClient;
intaddrClientlen=sizeof(addrClient);
sClient=accept(sServer,(sockaddrFAR*)&addrClient,&addrClientlen);
if(INVALID_SOCKET==sClient)
{
cout<<"acceptfailed!"<<endl;
closesocket(sServer);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}
while(true)
{
//接收客戶端數據
ZeroMemory(buf,BUF_SIZE);
retVal=recv(sClient,buf,BUF_SIZE,0);
if(SOCKET_ERROR==retVal)
{
cout<<"recvfailed!"<<endl;
closesocket(sServer);//關閉套接字
closesocket(sClient);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}
if(buf[0]=='0')
break;
cout<<"客戶端發送的數據:"<<buf<<endl;
cout<<"向客戶端發送數據:";
cin>>sendBuf;
send(sClient,sendBuf,strlen(sendBuf),0);
}
//退出
closesocket(sServer);//關閉套接字
closesocket(sClient);//關閉套接字
WSACleanup();//釋放套接字資源;
return0;
}
客戶端程序:
#include"winsock2.h"
#include<iostream>
#pragmacomment(lib,"ws2_32.lib")
usingnamespacestd;
BOOLRecvLine(SOCKETs,char*buf);//讀取一行數據
intmain(intargc,char*argv[])
{
constintBUF_SIZE=64;
WSADATAwsd;//WSADATA變數
SOCKETsHost;//伺服器套接字
SOCKADDR_INservAddr;//伺服器地址
charbuf[BUF_SIZE];//接收數據緩沖區
charbufRecv[BUF_SIZE];
intretVal;//返回值
//初始化套結字動態庫
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
cout<<"WSAStartupfailed!"<<endl;
return-1;
}
//創建套接字
sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sHost)
{
cout<<"socketfailed!"<<endl;
WSACleanup();//釋放套接字資源
return-1;
}
//設置伺服器地址和埠
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
servAddr.sin_port=htons((short)4999);
intnServAddlen=sizeof(servAddr);
//連接伺服器
retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));
if(SOCKET_ERROR==retVal)
{
cout<<"connectfailed!"<<endl;
closesocket(sHost);//關閉套接字
WSACleanup();//釋放套接字資源
return-1;
}
while(true)
{
//向伺服器發送數據
ZeroMemory(buf,BUF_SIZE);
cout<<"向伺服器發送數據:";
cin>>buf;
retVal=send(sHost,buf,strlen(buf),0);
if(SOCKET_ERROR==retVal)
{
cout<<"sendfailed!"<<endl;
closesocket(sHost);//關閉套接字
WSACleanup();//釋放套接字資源
return-1;
}
//RecvLine(sHost,bufRecv);
ZeroMemory(bufRecv,BUF_SIZE);
recv(sHost,bufRecv,BUF_SIZE,0);//接收伺服器端的數據,只接收5個字元
cout<<endl<<"從伺服器接收數據:"<<bufRecv;
cout<<" ";
}
//退出
closesocket(sHost);//關閉套接字
WSACleanup();//釋放套接字資源
return0;
}
④ vb中c/s程序,客戶端怎樣訪問伺服器端資料庫
在服務端做資料庫訪問的介面並且實現介面,然後在客戶端調用這個介面就可以了,。。
如果是基於互聯網的分布式應用也可以用"WebServices+VB"實現
去"微軟學生中心"網站下載"Web Service開發入門"視頻課件看看,挺簡單的
http://www.msuniversity.e.cn/default.aspx
⑤ 客戶端怎麼連接伺服器
問題一:客戶端如何連接伺服器 客戶端通過終端(終端有下載的軟體,包括瀏覽器也屬於終端),通過一個埠,連接到伺服器指定的埠。伺服器會監聽這個埠,如何有這個埠的應用訪問,則和終端用戶交互,從而達到客戶端連接伺服器的作用。
問題二:客戶端怎麼連接到伺服器的資料庫上? 既然是這種資料庫,那你就在你的電腦上裝SQL SEVER資料庫,然後下載對應的資料庫管理軟體就行了,當然在你安裝完本地的資料庫後要想訪問遠程伺服器上的資料庫一定需要配置,至於你說的一步一步,我覺得你應該網路搜一下,具體的安裝都有
問題三:java中客戶端與伺服器之間怎樣連接? socket通信
客戶端:Socket s= new Socket (localhost,8888);
伺服器:ServerSocket ss戶= new ServerSocket(8888);
Socket s=ss.accept();
問題四:客戶端無法連接到伺服器 您好
您可以嘗試一下右擊伺服器的我的電腦-屬性,找到遠程桌面的部分,允許下
到伺服器防火牆看看,是不是禁用了遠程桌面,不懂的話直接關閉防火牆,也希望你沒安裝第三方網路防火牆
問題五:跪求金蝶K3客戶端怎麼連接伺服器 K3客戶端和伺服器都要完整安裝好,確定是在同一個網關內,並且能夠相互PING得通。
然後再伺服器上新建一個,與客戶端開機登錄的用戶名和密碼一致的用戶(我的電腦->右擊->管理->本地用戶和組->用戶),
之後就是在客戶端遠程組建配置工具中測試,通過後確定就OK了。
問題六:java怎麼知道客戶端連接伺服器 java socket就可以完成
問題七:Android客戶端怎麼與伺服器資料庫連接? 客戶端和服務端的資料庫連接,是要伺服器端做開發的,像javaee開發的服務端,然後客戶端通過等連接到服務端,然後服務端通過一系列操作,吧數據返回給客戶端,這樣就完成了一次連接。
問題八:上網認證客戶端無法連接認證伺服器怎麼辦? 認證客戶端常見問題解答
1.客戶端一運行即消失的故障?
答:故障原因:如果用戶的電腦設置了多個DNS或多個IP地址及系統里有system32.exe這個進程,可能是木馬進程序,有可能偽裝成其它的名字的話,會導致以上故障。
故障解決辦法如下:正確設置IP地址(只設置網路中心提供的地址)及DNS地址。
2.客戶端提示「找不到合適的網卡」故障信息?
答:故障原因:系統沒有正確獲得網卡信息,或者網卡有問題。
故障解決辦法如下:退出並重新打開客戶端,如果問題依舊存在,請將網卡驅動程序卸載重裝,如果還是不能解決問題,更換一張網卡。
3.客戶端提示「目前系統工作環境與軟體運行環境相沖突,軟體不能正常運行,CODE=2」的故障信息?
答:故障原因:安裝了多塊網卡,與客戶端運行的環境不符合要求。
故障解決辦法:卸載或者禁用多餘網卡,只保留一張網卡運行。
4.客戶端提示「目前系統工作環境與軟體運行環境相沖突,軟體不能正常運行CODE=4」的故障信息?
答:故障原因:由於安裝了代理軟體,與客戶端運行的環境不符合要求。
故障解決辦法:關閉或卸載代理伺服器以及一切可能成為代理伺服器的軟體。
5.客戶端認證失敗,沒有任何的錯誤提示信息?
答:故障原因:WINXP啟用了系統自帶的802.1X功能。
故障解決辦法:雙擊網路連接圖標,把屬性裡面的身份驗證標簽下「啟用802.1X身份認證」前的勾去掉。
6.客戶端提示認證失敗,提示「已達到最大連接數」的故障?
答:故障原因:使用的帳號已在線,可能使用了別人的帳號,或者帳號輸入錯誤。
故障解決辦法:確認自己帳號正確性,如果確屬自己帳號,則告知相關請有效證件,要求網路中心將其帳號下線。
7.客戶端提示認證失敗,提示「IP類型錯誤」的故障?
答:故障原因:認證伺服器沒有獲得IP地址信息。
故障解決辦法:在本地連接屬性裡面把IP獲取方式改為自動獲取,如果還是不能解決,請將網卡驅動程序卸載重裝一次。
8.客戶端提示認證失敗,提示「XXXX綁定錯誤」的故障?
答:故障原因:非正常使用帳號;目前使用的網卡相關設置和教育技術辦用戶信息資料庫里的相關綁定記錄不一致。
故障解決方法:正確使用個人帳號,不要隨意更改設置;帶有效證件到網路中心做修改。
9.客戶端提示認證失敗,提示「網卡未連接上」的故障?
答:故障原因:網線連接不正確,交換機櫃停電等。
故障解決方法:檢查網線是否正常,確認機房交換機櫃是否停電。
10.客戶端提示認證失敗,認證客戶端停頓在:「尋找認證伺服器。。。」的故障?
答:故障原因:可能網卡有問題,或者沒有選擇「使用私有組播地址認證」。
故障解決方法:檢查網線是否正常;將速率改成10M,在實際運行中存在某些線路無法進行100M的數據交換;在認證客戶端中設置「使用私有組播地址認證」;重裝網卡驅動程序;如果問題依舊存在,更換一張網卡。如果在更換網卡之後出現「MAC地址綁定錯誤」,證明以前用的網卡質量不好,請使用新的網卡,並網路中心重新綁定。
11.客戶端提示初始化網卡信息失敗的故障?
答:故障原因:電腦有多個網卡信息。
故障解決方法:禁用掉無用的網卡,特別注意,很多筆記本電腦帶無線網卡,一定要禁用掉!
12.客戶端無法認證成功,提示「不在認證時段內」的故障?
答:故障原因:不在允許的時段內認證使用網路。
故障解決方法:請確認時間段是否為管理人員允許上網的時段。
13.客戶端無法認證成功,提示「用戶不存在或者密碼錯」的故障?
......>>
問題九:socket怎樣使得多個客戶端連接到一個伺服器 在伺服器端設置一個標志變數,如int flag = 0,當有客戶端連接上了,就檢查那個標志變數是否為0,如果是的話就連接,然後將這個標志設為1。如果為1的話就拒絕連接。我不知道你是用什麼語言編寫的,所以具體怎麼去拒絕連接就自己多想想吧・・・
在java裡面很容易實現,下面是我在java中實現的伺服器端代碼,希望對你有幫助。。。
package ob;
import java.io.IOException;
import java.ServerSocket;
import java.Socket;
public class Server {
Socket socket;
boolean flag = true;
public void createServer() {
try {
ServerSocket serverSocket = new ServerSocket(9090);
while (true) {
socket = serverSocket.accept();
if (flag) {
System.out.println(有用戶連上・・・);
System.out.println(ip:+socket.getRemoteSocketAddress().toString()+ port:+socket.getPort());
flag = false;
}else{
System.out.println(有用戶連上・・・);
socket.close();
System.out.println(關閉用戶連接・・・);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Server().createServer();
}
}
問題十:socket客戶端如何連接伺服器端 import java.*;
import java.lang.*;
import java.io.*;
public class MySocketServer
{
public static void main(String args[]) throws IOException
{
try{
ServerSocket myServer = new ServerSocket(8018);
System.out.println(正在監聽埠:+myServer.getLocalPort());
Socket myClient = null;
boolean flag = true;
String InputMessage = null;
int c;
while(flag)
{
myClient = myServer.accept();
接收客戶端的信息,如果不是Stop就繼續監聽,加個if判斷
DataInputStream dataIn = new DataInputStream(myClient.getInputStream());
DataInputStream dataIn = new DataInputStream(new BufferedInputStream(myClient.getInputStream()));
OutputStream dataOut = myClient.getOutputStream();
while( (InputMessage = dataIn.readLine()) != null )
{
if( InputMessage.equals(stop))
{
flag = false;
break;
}
else
{
System.out.println(從客戶端接收到的信息是:+InputMessage);
輸入:讀取至 末尾-1結束,遇到回車'\n'結束:
while((c=System.in.read())!= -1)
{
dataOut.write((byte)c);
if( c== '\n')
{
dataOut.flush();
......>>