c#如何实现多个客户端的通信(同一个服务器)
客户端之间的通讯有两个办法。
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的编程参考手册,可供参考。
0条评论