導航:首頁 > 配伺服器 > 一個伺服器怎麼跑兩個程序

一個伺服器怎麼跑兩個程序

發布時間:2022-10-09 14:46:00

❶ 用C#如何將兩個界面程序連接到一個伺服器上並可以實時通信

一、摘要
總結基於C#的UDP協議的同步通信。

二、實驗平台
Visual Studio 2010

三、實驗原理
UDP傳輸協議同TCP傳輸協議的區別可查閱相關文檔,此處不再贅述。

四、實例
4.1 採用socket實現UDP
由於UDP是一種無連接的協議。因此,為了使伺服器應用能夠發送和接收UDP數據包,則需要做兩件事情:
(1) 創建一個Socket對象;
(2) 將創建的套接字對象與本地IPEndPoint進行綁定。
完成上述步驟後,那麼創建的套接字就能夠在IPEndPoint上接收流入的UDP數據包,或者將流出的UDP數據包發送到網路中其他任意設備。使用UDP進行通信時,不需要連接。因為異地的主機之間沒有建立連接,所以UDP不能使用標準的Send()和Receive()t套接字方法,而是使用兩個其他的方法:SendTo()和ReceiveFrom()。

SendTo()方法指定要發送的數據,和目標機器的IPEndPoint。該方法有多種不同的使用方法,可以根據具體的應用進行選擇,但是至少要指定數據包和目標機器。如下:
SendTo(byte[] data,EndPoint Remote)
ReceiveFrom()方法同SendTo()方法類似,但是使用EndPoint對象聲明的方式不一樣。利用ref修飾,傳遞的不是一個EndPoint對象,而是將參數傳遞給一個EndPoint對象。

UDP應用不是嚴格意義上的真正的伺服器和客戶機,而是平等的關系,即沒有主與次的關系。為了簡便起見,仍然把下面的這個應用叫做UDP伺服器。

伺服器端代碼:

復制代碼
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDP
{
class Program
{
static void Main(string[] args)
{
int recv;
byte[] data = new byte[1024];

//得到本機IP,設置TCP埠號
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 8001);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

//綁定網路地址
newsock.Bind(ip);

Console.WriteLine("This is a Server, host name is {0}", Dns.GetHostName());

//等待客戶機連接
Console.WriteLine("Waiting for a client");

//得到客戶機IP
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)(sender);
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}: ", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));

//客戶機連接成功後,發送信息
string welcome = "你好 ! ";

//字元串與位元組數組相互轉換
data = Encoding.ASCII.GetBytes(welcome);

//發送信息
newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
while (true)
{
data = new byte[1024];
//發送接收信息
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
newsock.SendTo(data, recv, SocketFlags.None, Remote);
}
}

}
}
復制代碼
對於接收流入的UDP伺服器程序來說,必須將程序與本地系統中指定的UDP埠進行綁定。這就可以通過使用合適的本地IP地址創建一個IPEndPoint對象,以及合適的UDP埠號。上述范常式序中的UDP伺服器能夠在埠8001從網路上接收任意流入的UDP數據包。

UDP客戶機程序與伺服器程序非常類似。
因為客戶機不需要在指定的UDP埠等待流入的數據,因此,不使用Bind()方法,而是使用在數據發送時系統隨機指定的一個UDP埠,而且使用同一個埠接收返回的消息。在開發產品時,要為客戶機指定一套UDP埠,以便伺服器和客戶機程序使用相同的埠號。UDP客戶機程序首先定義一個IPEndPoint,UDP伺服器將發送數據包到這個IPEndPoint。如果在遠程設備上運行UDP伺服器程序,在IPEndPoint定義中必須輸入適當的IP地址和UDP埠號信息。

客戶端代碼:

復制代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDPClient
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
string input, stringData;

//構建TCP 伺服器
Console.WriteLine("This is a Client, host name is {0}", Dns.GetHostName());

//設置服務IP,設置TCP埠號
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);

//定義網路類型,數據連接類型和網路協議UDP
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

string welcome = "你好! ";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ip);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sender;

data = new byte[1024];
//對於不存在的IP地址,加入此行代碼後,可以在指定時間內解除阻塞模式限制
int recv = server.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}: ", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
while (true)
{
input = Console.ReadLine();
if (input == "exit")
break;
server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
data = new byte[1024];
recv = server.ReceiveFrom(data, ref Remote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Console.WriteLine("Stopping Client.");
server.Close();
}

}
}
復制代碼

上述代碼的實現邏輯為:相關設置完成後,伺服器端先向客戶端發送信息,之後客戶端通過鍵盤發送字元串,伺服器端收到後再發送給客戶端,如此循環。

4.2 採用UDPClient類實現
伺服器端代碼:

復制代碼
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class Custom
{
// 設置IP,IPV6
private static readonly IPAddress GroupAddress = IPAddress.Parse("IP地址");
// 設置埠
private const int GroupPort = 11000;

private static void StartListener()
{
bool done = false;

UdpClient listener = new UdpClient();

IPEndPoint groupEP = new IPEndPoint(GroupAddress, GroupPort);

try
{
//IPV6,組播
listener.JoinMulticastGroup(GroupAddress);

listener.Connect(groupEP);

while (!done)
{
Console.WriteLine("Waiting for broadcast");

byte[] bytes = listener.Receive(ref groupEP);

Console.WriteLine("Received broadcast from {0} :\n {1}\n", groupEP.ToString(), Encoding.ASCII.GetString(bytes, 0, bytes.Length));
}

listener.Close();

}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}

}

public static int Main(String[] args)
{
StartListener();

return 0;
}
}
復制代碼

客戶端代碼:

復制代碼
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class Client
{

private static IPAddress GroupAddress = IPAddress.Parse("IP地址");

private static int GroupPort = 11000;

private static void Send(String message)
{
UdpClient sender = new UdpClient();

IPEndPoint groupEP = new IPEndPoint(GroupAddress, GroupPort);

try
{
Console.WriteLine("Sending datagram : {0}", message);

byte[] bytes = Encoding.ASCII.GetBytes(message);

sender.Send(bytes, bytes.Length, groupEP);

sender.Close();

}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}

}

public static int Main(String[] args)
{
Send(args[0]);

return 0;
}
}
復制代碼

以上代碼需要說明的是:

(1) 上述代碼是基於IPV6地址的組播模式。IPv4中的廣播(broadcast)可以導致網路性能的下降甚至廣播風暴(broadcast storm)。在IPv6中就不存在廣播這一概念了,取而代之的是組播(multicast)和任意播(anycast)。

(2) IPV6地址表示方法:

a) X:X:X:X:X:X:X:X(每個X代表16位的16進制數字),不區分大小寫;

b) 排頭的0可省略,比如09C0就可以寫成9C0,0000可以寫成0;

c) 連續為0的欄位可以以::來代替,但是整個地址中::只能出現一次,比如FF01:0:0:0:0:0:0:1就可以簡寫成FF01::1。

(3) 如果是採用窗體的形式建議使用這種格式,否則在接收數據時可能會出現死機的現象。

復制代碼
// 創建一個子線程

Thread thread = new Thread(
delegate()
{
try
{
//在這里寫你的代碼
}
catch (Exception )
{

}
}
);

thread.Start();
復制代碼

❷ 伺服器端跑程序怎麼實現

:需要用到socket編程的相關知識。 也不知道你是要在windows下面做還是linux下做,因此給你提供個思路,兩個操作系統下的思路是一樣的,他們都提供了網路編程的相關函數。 需要一個客戶端程序和一個伺服器端的程序。

❸ 如何在一台伺服器中配置多個小程序

  1. 伺服器可以安裝多個小程序的。

  2. 伺服器分割多個虛擬主機就可以使用了。

❹ 一台伺服器,部署多個項目

首先確定你需要在什麼模式下進行設置,一種是改變埠方法可以同時多個項目進行部署,一種是建立多個虛擬機,進行設置。

❺ 怎麼在同一個mysql里配置mysql跑兩個埠,如3306和3312兩個

在同一個mysqld上運行多個埠伺服器的3306埠上已經運行了一個mysql服務,配置文件位於默認的 etc my
cnf下,現在需要再開一個埠運行mysql服務,希望能重用當前mysql的配置(修改某項共用配置時只需要修改一

在同一個mysqld上運行多個埠

伺服器的3306埠上已經運行了一個mysql服務,配置文件位於默認的/etc/my.cnf下,現在需要再開一個埠運行mysql服務,希望能重用當前mysql的配置(修改某項共用配置時只需要修改一處即可)。

網上有一篇通過mysqld_multi在同一個mysql下運行多個示例的文章,它是在配置文件的[mysqld_multi]里指定程序路徑,[mysqld1]、[mysql2]里分別指定相應的配置。但我還是想直接通過mysqld_safe方式啟動,不想在公共配置里指定每一個datadir目錄。經過一番摸索,可以這樣做:

0.

❻ 伺服器,可以部署兩個javaweb項目嗎

可以,我用的是tomcat,放了三個項目在運行,不過如果你的兩個項目都設置了監聽器可能要在web.xml配置下,在其中一個項目的web.xml上添加這一段就好了:
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>app.root</param-value>
</context-param>
<context-param>

❼ 如何在linux環境下同時跑兩個程序

比如說,你的伺服器程序名叫server
在終端運行
./server &
表示伺服器後台運行
然後在運行客戶端程序

結束的時候
ps
顯示後台程序,記住進程號pid
kill -9 (進程號)
停止伺服器程序

閱讀全文

與一個伺服器怎麼跑兩個程序相關的資料

熱點內容
安卓手機微信發不出視頻怎麼弄 瀏覽:229
壓縮機專用工具 瀏覽:575
qtcreator可以編譯cp嗎 瀏覽:405
小項目是雲伺服器還是本地好 瀏覽:14
墨痕齋是什麼游戲的伺服器 瀏覽:942
word文件如何壓縮大小 瀏覽:279
遵義聯通伺服器地址是什麼 瀏覽:29
ansys約束命令流 瀏覽:814
解壓軟體電腦版如何下載 瀏覽:791
閃電匕首演算法球 瀏覽:692
linuxredis停止命令 瀏覽:670
大麥賬號怎麼加密 瀏覽:113
穿越火線怎麼找伺服器 瀏覽:526
秘密加密社交軟體app 瀏覽:256
c語言編譯器怎麼找文件 瀏覽:836
數學不好能編程嗎 瀏覽:254
微雲里的視頻加密 瀏覽:41
3大加密貨幣交易平台 瀏覽:647
鈑金激光切割機編程 瀏覽:496
vivo手機手電筒app在哪裡 瀏覽:787