如何写服务器和客户端
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"
端口随便你写,只要系统不冲突就行。