c#如何实现多个客户端的通信(同一个服务器)

c#如何实现多个客户端的通信(同一个服务器),第1张

客户端之间的通讯有两个办法。

1

服务器中转

2

服务器上注册后,客户端之间直接通信。

对于第一种方法,大多比较简单。查一下socket的文章,还有大把现成的代码给你看。

第二个方法就稍微复杂一些。

但原理都一样。客户端A,链接服务器后,地址信息就保存到了服务器上。除了保持与服务器的通信外。另外开启一个

Socket,绑定到另一个端口,并且一直监听此端口。

客户端B连接服务器,从服务器上获取客户端A的地址信息。把客户端A当成服务器,连接A。

如果只是两个客户端和一个服务器,可通过服务器转发即可,两个客户端连接到服务器,服务器把从A接收到的发给B,把从B接收到的发给A即可,如果要做成多个客户端的,则要给各个客户端分配ID,服务端好根据各个客户端和消息要转发送给客户端的ID来确定消息发送对象。

(1) 连接 当客户在浏览器上键入或单击一个URL时,客户程序就在网络上搜索定位正确的服务器,并与其连接。

(2) 请求 在连接后,客户程序向服务器发出一个请求,要求服务器向自己发送指定的信息。

(3) 响应 服务器收到请求,就向客户端传回所需要的文件。

(4)关闭 服务器发出数据后,就断开与客户端的连接,以便接受其他客户的连接。

1、从网络协议上来看,就http方式和socket方式。

2、http方式开发起来效率想对要高一点,但是对于推送这种来说,想对要难做点,因为http是短连接。socket这种方式开发要长,调试略微麻烦,但是做推送想对简单,可以建立一个长连接。

3、Web Service服务其实也是基于HTTP协议(它基于SOAP协议,而SOAP又是基于HTTP协议)。

最大缺点我觉得是Web Service实在是太厚重了,特别对于移动端来说,WSDL是基于XML,XML已经够厚重了,WSDL还有一些头信息,更加厚重。

而且JSON + HTTP的方式,相对来说就非常轻量级了,JSON格式数据本生就是Javascript中的数据或者对象,所以在网络传输中具有非常明显优势,可以说本来就是网络传输用的,毫无违和感嘛:)

还有一个不能算缺点的缺点:目前移动端HTTP网络库多的要死,Web Service我所知道就是ksoap2,而且非常的难用。。。

以前写的,照贴了。。。服务器端:import javaawt;

import javaawteventWindowAdapter;

import javaawteventWindowEvent;

import javaio;

import javanet;/6、 采用UDP协议,编写一个Java网络应用程序,该应用分服务器端程序和客户端程序两部分。

客户端指定一个服务器上的文件名,让服务器发回该文件的内容,或者提示文件不存在。

(20分)(服务端程序和客户端程序分别命名为Serverjava和Clientjava)/

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, buflength);

socketreceive(packet);

file = new File(new String(packetgetData()));

socket = new DatagramSocket();

}

catch (Exception e)

{eprintStackTrace();

}

if(fileexists())

{

try

{

buf = new byte[(int)filelength()];

packet = new DatagramPacket(buf,buflength,InetAddressgetLocalHost(),1234);

input = new FileInputStream(file);

inputread(buf);

socketsend(packet);

}

catch (IOException e)

{

eprintStackTrace();

}

}

else

{

try

{

packet = new DatagramPacket(messagegetBytes(),messagegetBytes()length,

InetAddressgetLocalHost(),1234);

socketsend(packet);

}

catch (Exception e)

{

eprintStackTrace();

}

}

}

public static void main(String[] args)

{

new N4BT6("Server");

}

}

客户端:import javaawt;

import javaawtevent;

import javanetDatagramPacket;

import javanetDatagramSocket;

import javanetInetAddress;public class N4BT6_2 extends Frame

{

TextArea text;

String message = "Qtxt";

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(messagegetBytes(),messagegetBytes()length,

InetAddressgetLocalHost(),1230);

socketsend(packet);

}

catch (Exception e)

{

eprintStackTrace();

}

try

{

buf = new byte[1024];

socket = new DatagramSocket(1234);

packet = new DatagramPacket(buf,buflength);

socketreceive(packet);

textappend(new String(buf));

}

catch (Exception e)

{

eprintStackTrace();

}

}

public static void main(String[] args)

{

new N4BT6_2("Client");

}

}

我的理解,上位机是客户端,PLC是服务端。因为访问由上位机发起,而PLC被动的响应。

矩形PLC的以太网口,是Modbus-tcp协议,可以利用socket套接字控件编程。

下面有一个附件,是Modbus-tcp的编程参考手册,可供参考。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » c#如何实现多个客户端的通信(同一个服务器)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情