如何寫伺服器和客戶端
1. 用C#在一台機器上實現伺服器和客戶端之間的通信(socket的小實驗),哪位高手給我看看怎麼編寫
socket_client
---------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace socket_client
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
IPEndPoint end;
Socket s;
Thread td;
private void button1_Click(object sender, EventArgs e)
{
try
{
int port = Int32.Parse(textBox2.Text.Substring(textBox2.Text.LastIndexOf(":") + 1));
IPAddress ip = IPAddress.Parse(textBox1.Text.Substring(textBox1.Text.LastIndexOf(":") + 1));
end = new IPEndPoint(ip, port);
}
catch
{
MessageBox.Show("輸入有誤!!");
textBox1.Text = "IP:";
textBox2.Text = "埠:";
return;
}
try
{
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Connect(end);
label1.Text = "成功聯接上伺服器 " + textBox1.Text + ":" + textBox2.Text;
td = new Thread(new ThreadStart(bb));
td.IsBackground = true;
td.Start();
}
catch
{
label1.Text = "聯接失敗伺服器!! ";
}
}
void bb()
{
while (true)
{
byte[] bb = new byte[1024];
int i= s.Receive(bb); //接收數據,返回每次接收的位元組總數
string removeMsg = Encoding.Unicode.GetString(bb,0,i);
if (removeMsg == "cmd---exit")//收到的是退出通知
{
richTextBox1.Text = "";
label1.Text = "無連接";
DialogResult re=MessageBox.Show("伺服器已經關閉.\n\"確定\"後退出程序,\n\"取消\"繼續停留!", "消息提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
MessageBox.Show(re.ToString());
if (re == DialogResult.OK)
{
sendExit();//告訴伺服器我退出了
Application.Exit();
}
return;
}
richTextBox1.AppendText(removeMsg) ;
richTextBox1.ScrollToCaret();
}
}
private void button2_Click(object sender, EventArgs e)
{
string msg = "客戶端說:" + richTextBox2.Text+"\n";
richTextBox1.AppendText(msg);
byte[] by = Encoding.Unicode.GetBytes(msg);
s.Send(by);
richTextBox2.Text = "";
richTextBox2.Focus();
richTextBox1.ScrollToCaret();
}
void sendExit()
{
string msg = "cmd---exit";
byte[] by = Encoding.Unicode.GetBytes(msg);
s.Send(by);
}
}
}
socket_server
-----------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace socket_server
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "監聽埠" + Dns.GetHostByName(Dns.GetHostName()).AddressList[0] + ":" + Int32.Parse(textBox1.Text.Substring(textBox1.Text.LastIndexOf(":") + 1)) + "中......";
Thread td = new Thread(new ThreadStart(aa));
td.Start();
if (button1.Text == "開始監聽")
{
button1.Text = "停止監聽";
return;
}
else
{
sendExit();
ss.Shutdown(SocketShutdown.Both);
s.Close();
td.Abort();
label1.Text = "停止監聽!";
richTextBox1.Text = "";
button1.Text = "開始監聽";
}
}
void sendExit()
{
string msg = "cmd---exit";
byte[] by = Encoding.Unicode.GetBytes(msg);
ss.Send(by);
}
Socket s;
Socket ss;
void aa()
{
int port = Int32.Parse(textBox1.Text.Substring(textBox1.Text.LastIndexOf(":") + 1));
IPEndPoint end = new IPEndPoint(Dns.GetHostByName(Dns.GetHostName()).AddressList[0], port);
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind(end);
s.Listen(5);
ss=s.Accept();
if (ss.Connected)
{
label1.Text = "有客戶端聯接上埠:"+textBox1.Text;
while (true)
{
byte[] by = new byte[1024];
int i = ss.Receive(by);
string msg = Encoding.Unicode.GetString(by, 0, i);
if (msg == "cmd---exit")
{
label1.Text = "客戶端已經取消連接!";
return;
}
richTextBox1.AppendText(msg);
richTextBox1.ScrollToCaret();
}
}
}
private void button2_Click(object sender, EventArgs e)
{
string m = "伺服器說:" + richTextBox2.Text + "\n";
richTextBox1.AppendText(m);
byte[] by = Encoding.Unicode.GetBytes(m);
ss.Send(by);
richTextBox2.Text = "";
richTextBox2.Focus();
richTextBox1.ScrollToCaret();
}
private void button3_Click(object sender, EventArgs e)
{
string w="123455";
MessageBox.Show(w.Substring(0));
}
}
}
2. 客戶端與伺服器端的通訊,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;
}
3. C#, WCF如何創建一個簡單的伺服器端和客戶端程序
首先VS中的模板WCF SERVICE APP 項目,是一個承載到IIS的服務,用過web service就清楚,部署都差不多。
客戶端引用wcf服務,知道url地址就行了,客戶端添加服務引用,和添加以前的web service差不多。
客戶端使用到服務端的數據模型,在服務端定義實體類時,添加 datacontract屬性和datamember屬性就ok.
推薦一些教程地址,可以選擇了看看,你提到的這些問題在教程中都有涉及到。
1,WCF系列學習5天速成 http://www.cnblogs.com/huangxincheng/category/340145.html
2,WCF入門學習【Sheldon_Lou】http://www.cnblogs.com/sheldon-lou/category/648478.html
3,無廢話WCF系列教程 http://www.cnblogs.com/iamlilinfeng/category/415833.html
4,WCF編程 http://www.cnblogs.com/zxj159/category/604460.html
5,WCF入門【停留的風】http://www.cnblogs.com/yank/category/568085.html
6,WCF初探【wangweimutou】http://www.cnblogs.com/wangweimutou/tag/WCF/
7,WCF【指尖流淌】http://www.cnblogs.com/jianliutang/category/277163.html
8,WCF【xfrog】---重點 http://www.cnblogs.com/xfrog/tag/WCF/
4. java網路編程應該怎樣在客戶端和伺服器間實現通信
以前寫的,照貼了。。。伺服器端:import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.net.*;/*6、 採用UDP協議,編寫一個Java網路應用程序,該應用分伺服器端程序和客戶端程序兩部分。
* 客戶端指定一個伺服器上的文件名,讓伺服器發回該文件的內容,或者提示文件不存在。
* (20分)(服務端程序和客戶端程序分別命名為Server.java和Client.java)*/
public class N4BT6 extends Frame
{
DatagramSocket socket ;
DatagramPacket packet ;byte[] buf ;
File file ;
FileInputStream input;
String message = "該文件不存在";
TextArea text;
public N4BT6(String title)
{
super(title);
text = new TextArea(6,4);
add(text);
setSize(400, 300);
setVisible(true);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
dispose();
}
});
buf = new byte[1024];
try
{
socket = new DatagramSocket(1230);
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
file = new File(new String(packet.getData()));
socket = new DatagramSocket();
}
catch (Exception e)
{e.printStackTrace();
}
if(file.exists())
{
try
{
buf = new byte[(int)file.length()];
packet = new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),1234);
input = new FileInputStream(file);
input.read(buf);
socket.send(packet);
}
catch (IOException e)
{
e.printStackTrace();
}
}
else
{
try
{
packet = new DatagramPacket(message.getBytes(),message.getBytes().length,
InetAddress.getLocalHost(),1234);
socket.send(packet);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
new N4BT6("Server");
}
}
客戶端:import java.awt.*;
import java.awt.event.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class N4BT6_2 extends Frame
{
TextArea text;
String message = "Q.txt";
DatagramSocket socket ;
DatagramPacket packet;
byte[] buf;
public N4BT6_2(String title)
{
super(title);
text = new TextArea(6,4);
add(text);
setSize(400, 300);
setVisible(true);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
dispose();
}
});
try
{
socket = new DatagramSocket();
packet = new DatagramPacket(message.getBytes(),message.getBytes().length,
InetAddress.getLocalHost(),1230);
socket.send(packet);
}
catch (Exception e)
{
e.printStackTrace();
}
try
{
buf = new byte[1024];
socket = new DatagramSocket(1234);
packet = new DatagramPacket(buf,buf.length);
socket.receive(packet);
text.append(new String(buf));
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
new N4BT6_2("Client");
}
}
5. 客戶端與伺服器端的通訊,C++書寫步驟。
要實現客戶端與伺服器端的通訊,需要兩部分C++的程序:伺服器端程序代碼和客戶端代碼。
首先是伺服器端程序代碼:
#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "ws2_32.lib")
void main()
{
WSADATA wsaData;
int port = 5099;
char buf[] = "Server: hello, I am a server.....";
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("Failed to load Winsock");
return;
}
//創建用於監聽的套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(port); //1024以上的埠號
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
int retVal = bind(sockSrv, (LPSOCKADDR)&addrSrv, sizeof(SOCKADDR_IN));
if(retVal == SOCKET_ERROR){
printf("Failed bind:%d ", WSAGetLastError());
return;
}
if(listen(sockSrv,10) ==SOCKET_ERROR){
printf("Listen failed:%d", WSAGetLastError());
return;
}
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while(1)
{
//等待客戶請求到來
SOCKET sockConn = accept(sockSrv, (SOCKADDR *) &addrClient, &len);
if(sockConn == SOCKET_ERROR){
printf("Accept failed:%d", WSAGetLastError());
break;
}
printf("Accept client IP:[%s] ", inet_ntoa(addrClient.sin_addr));
//發送數據
int iSend = send(sockConn, buf, sizeof(buf) , 0);
if(iSend == SOCKET_ERROR){
printf("send failed");
break;
}
char recvBuf[100];
memset(recvBuf, 0, sizeof(recvBuf));
// //接收數據
recv(sockConn, recvBuf, sizeof(recvBuf), 0);
printf("%s ", recvBuf);
closesocket(sockConn);
}
closesocket(sockSrv);
WSACleanup();
system("pause");
}
接下來是客戶端代碼:
#include <WinSock2.h>#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
void main()
{
//載入套接字
WSADATA wsaData;
char buff[1024];
memset(buff, 0, sizeof(buff));
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("Failed to load Winsock");
return;
}
SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(5099);
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//創建套接字
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
if(SOCKET_ERROR == sockClient){
printf("Socket() error:%d", WSAGetLastError());
return;
}
//向伺服器發出連接請求
if(connect(sockClient, (struct sockaddr*)&addrSrv, sizeof(addrSrv)) == INVALID_SOCKET){
printf("Connect failed:%d", WSAGetLastError());
return;
}else
{
//接收數據
recv(sockClient, buff, sizeof(buff), 0);
printf("%s ", buff);
}
//發送數據
char buff = "hello, this is a Client....";
send(sockClient, buff, sizeof(buff), 0);
//關閉套接字
closesocket(sockClient);
WSACleanup();
}
6. 易語言怎麼編寫伺服器與客戶端連接並接收數據登錄賬號!
自己寫倆軟體 一個建個伺服器組件 一個是客戶端組件
客戶端連接上伺服器以後 發送數據 最前面加個標識符 比如前面加個Y是用戶名 M是密碼
然後伺服器收到數據以後 判斷以下收到的數據取文本最前面標識符是什麼 然後相應自己寫出到一個TXT文件里保存
以此類推 以這種發送封包然後伺服器判斷封包標識符來保存這些數據
伺服器最後再加上 判斷客戶端登錄的帳號 然後發送數據 也是用封包傳送 等級 物品 金錢之類的東西 客戶端登錄成功以後 通過伺服器來獲取這些信息
如果你覺得麻煩的話直接保存到他本地的文件里 寫配置項然後加密 保存到C盤他一般找不到的地方 然後每次打開的時候讀取本地保存的配置項就可以了
7. 用本機socket編寫伺服器和客戶端,並在本機上測試的時候,伺服器的ip地址和埠號要怎麼寫
本機你可以寫成 "127.0.0.1"或者"localhost",如果是安卓本機就是"10.0.2.2"
埠隨便你寫,只要系統不沖突就行。