C#, WCF如何创建一个简单的服务器端和客户端程序

C#, WCF如何创建一个简单的服务器端和客户端程序,第1张

首先VS中的模板WCF SERVICE APP 项目,是一个承载到IIS的服务,用过web service就清楚,部署都差不多。

客户端引用wcf服务,知道url地址就行了,客户端添加服务引用,和添加以前的web service差不多。

客户端使用到服务端的数据模型,在服务端定义实体类时,添加 datacontract属性和datamember属性就ok

推荐一些教程地址,可以选择了看看,你提到的这些问题在教程中都有涉及到。

1,WCF系列学习5天速成 >

要完成这个工作,需要完成三个部分的工作,以下依次说明:

一、建立服务器

Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。

ServerSocket server = new ServerSocket(9998)

这条语句创建了一个服务器对象,这个服务器使用9998号端口即在端口9998上注册服务,这里稍微要注意的是端口的分配必须是唯一的。因为端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且serveraccept()方法会创建一个Socket对象。服务器端便可以利用这个Socket对象与客户进行通讯。

Socket incoming = serveraccept() ; // 监听窗口,等待连接

进而得到输入流和输出流,并进行封装

BufferedReader in = new BufferedReader(new

InputStreamReader(incominggetInputStream()));

/

当读取文件时,先把内容读到缓存中,当调用inreadLine()时,再从缓存中以字符的方式读取数据(以下简称“缓存字节读取方式”)。

/

PrintWriter ut = new PrintWriter(incominggetOutputStream(),true);

随后,就可以使用inreadLine()方法得到客户端的输入,也可以使用outprintln()方法向客户端发送数据。从而可以根据程序的需要对客户端的不同请求进行回应。

在所有通讯结束以后应该关闭这两个数据流,关闭的顺序是先关闭输出流,再关闭输入流,即使用

outclose();

inclose();

二、建立客户端代码

相比服务器端,客户端要简单一些,客户端只需用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象。得到这个对象后,就可以用"建立服务器"部分介绍的方法实现数据的输入和输出。

Socket socket = new Socket("1681601242",9998);

或:

Socket socket = new Socket(InetAddressgetLocalHost(),5678); // 向主机名为InetAddressgetLocalHost()的服务器申请连接

客户机必须知道有关服务器的IP地址,对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供,它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。

in = new BufferedReader(new InputStreamReader(socketgetInputStream()));

out = new PrintWriter(socketgetOutputStream(),true);

以上的程序代码建立了一个Socket对象,这个对象连接到ip地址为1681601242的主机上、端口为9998的服务器对象。并且建立了输入流和输出流,分别对应服务器的输出和客户端的写入。

三、实例分析

服务方:

import javaio;

import javanet;

public class MyServer {

public static void main(String[] args) throws IOException{

ServerSocket server=new ServerSocket(5678); //在端口5678上注册服务

Socket client=serveraccept(); // 监听窗口,等待连接

BufferedReader in=new BufferedReader(new InputStreamReader(clientgetInputStream()));

BufferedReader serverInput=new BufferedReader(new InputStreamReader(Systemin));

PrintWriter ut=new PrintWriter(clientgetOutputStream());

while(true){

String str=inreadLine(); //// 读取从client传来的数据信息

str = serverInputreadLine(); // 读取用户键盘输入的字符串

Systemoutprintln(str); //服务器控制台输出数据信息

outprintln("has receive"); //服务器向客户端发送信息:has receive

outflush();

if(strequals("end"))

break;

}

clientclose();

}

}

这个程序的主要目的在于服务器不断接收客户机所写入的信息只到,客户机发送"End"字符串就退出程序,并且服务器也会做出"Receive"为回应,告知客户机已接收到消息。

客户机代码:

import javanet;

import javaio;

public class Client{

static Socket server;

public static void main(String[] args)throws Exception{

server=new Socket(InetAddressgetLocalHost(),5678); // 向主机名为InetAddressgetLocalHost()的服务器申请连接

BufferedReader in=new BufferedReader(new InputStreamReader(servergetInputStream())); //客户端建立输入流并进行封装

PrintWriter ut=new PrintWriter(servergetOutputStream());

BufferedReader wt=new BufferedReader(new InputStreamReader(Systemin)); //客户端从键盘输入信息

while(true){

String str=wtreadLine(); //客户端读取(获得)键盘的字符串

String str1=inreadLine(); // 从服务器获得字符串

outprintln(str); //客户端向服务器发送信息

outflush();

if(strequals("end")){

break;

}

Systemoutprintln(inreadLine());

}

serverclose();

}

}

客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"End"用来做退出标识。

这个程序只是简单的两台计算机之间的通讯,如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的。那么多个客户端如何实现呢

其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身,而服务器通过accept方法就是同意和客户建立通讯这样当客户建立Socket的同时。服务器也会使用这一根连线来先后通讯,那么既然如此只要我们存在多条连线就可以了。那么我们的程序可以变为如下:

服务器:

import javaio;

import javanet;

public class MyServer {

public static void main(String[] args) throws IOException{

ServerSocket server=new ServerSocket(5678);

while(true){

Socket client=serveraccept();

BufferedReader in=new BufferedReader(new InputStreamReader(clientgetInputStream()));

PrintWriter ut=new PrintWriter(clientgetOutputStream());

while(true){

String str=inreadLine();

Systemoutprintln(str);

outprintln("has receive");

outflush();

if(strequals("end"))

break;

}

clientclose();

}

}

}

这里仅仅只是加了一个外层的While循环,这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的"End"消息那么现在就实现了多客户之间的交互了。但是问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互,无法做到同时服务,那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。

那么下面的问题是如何使用线程首先要做的事情是创建线程并使得其可以和网络连线取得联系。然后由线程来执行刚才的 *** 作,要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了而要执行线程就必须重写run方法,而run方法所做的事情就是刚才单线程版本main所做的事情,因此我们的程序变成了这样:

import javanet;

import javaio;

public class MultiUser extends Thread{

private Socket client;

public MultiUser(Socket c){

thisclient=c;

}

public void run(){

try{

BufferedReader in=new BufferedReader(new InputStreamReader(clientgetInputStream()));

PrintWriter ut=new PrintWriter(clientgetOutputStream());

//Mutil User but can't parallel

while(true){

String str=inreadLine();

Systemoutprintln(str);

outprintln("has receive");

outflush();

if(strequals("end"))

break;

}

clientclose();

}catch(IOException ex){

}finally{

}

}

public static void main(String[] args)throws IOException{

ServerSocket server=new ServerSocket(5678);

while(true){

//transfer location change Single User or Multi User

MultiUser mu=new MultiUser(serveraccept());

mustart();

}

}

}

我的类直接从Thread类继承了下来并且通过构造函数传递引用和客户Socket建立了联系,这样每个线程就有了。一个通讯管道同样我们可以填写run方法,把之前的 *** 作交给线程来完成,这样多客户并行的Socket就建立起来了。

/ File: serverc /

#include <stdioh>

#include <sys/typesh>

#include <sys/socketh>

#include <netinet/inh>

int main(int argc, char argv)

{

int fd;

int address_len;

struct sockaddr_in address;

//建立套接口

fd = socket(AF_INET, SOCK_DGRAM, 0); //SOCK_DGRAM

//绑定地址和端口

bzero(&address, sizeof(address));

addresssin_family = AF_INET;

addresssin_addrs_addr = htonl(INADDR_ANY);

addresssin_port = htons(1234);

address_len = sizeof(address);

bind(fd, (struct sockaddr )&address, address_len);

while(1) {

struct sockaddr_in client_address;

socklen_t len = sizeof(client_address);

int n;

char line[80];

printf("waiting");

fflush(stdout);

//接收数据

n = recvfrom(fd, line, 80, 0,

(struct sockaddr )&client_address, &len);

printf("server received %d:%s", n, line);

//发送数据

sendto(fd, line, n, 0,

(struct sockaddr )&client_address, len);

}

}

/ File: clientc /

#include <sys/typesh>

#include <sys/socketh>

#include <netinet/inh>

int main(int argc, char argv)

{

int fd;

struct sockaddr_in address;

int address_len;

char line[80] = "Client to Server string!\n";

int n;

//建立套接口

fd = socket(AF_INET, SOCK_DGRAM, 0);//AF_INET和SOCK_DGRAM的组合对应UDP协议

//联接

bzero(&address, sizeof(address));

addresssin_family = AF_INET;

addresssin_addrs_addr = inet_addr("1931931961");

addresssin_port = htons(1234);

address_len = sizeof(address);

//发送数据

sendto(fd, line, strlen(line)+1, 0,

(struct sockaddr )&address, sizeof(address));

//接收数据

n = recvfrom(fd, line, 80, 0, NULL, NULL);

printf("received %d:%s", n, line);

}

仔细读一下,最好下次能自己写^_^,起码要弄懂原理

主要有三种方案

第一种是利用第三方的API来实现信息推送,主要包括环信、百度云推送、leancloud等

第二种通过javascript的setTimeout或者setInterval来实现,同理PHP端也可以用守护进程来实现

第三种通过Linux的计划任务来实时推送需要消息

以上就是关于C#, WCF如何创建一个简单的服务器端和客户端程序全部的内容,包括:C#, WCF如何创建一个简单的服务器端和客户端程序、DELPHI基础教程:Delphi客户服务器应用开发(四)[1]、基于JAVA socket的服务器客户端编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9748393.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存