導航:首頁 > IDC知識 > socket伺服器

socket伺服器

發布時間:2020-08-01 14:32:01

1、如何搭建websocket伺服器

在伺服器的選擇上很廣,基本上,主流語言都有WebSocket的伺服器端實現,而我們作為前端開發工程師,當然要選擇現在比較火熱的NodeJS作為我們的伺服器端環境了。
NodeJS本身並沒有原生的WebSocket支持,但是有第三方的實現(大家要是有興趣的話,完全可以參考WebSocket協議來做自己的實現),我們選擇了「ws」作為我們的伺服器端實現。
由於本文的重點是講解WebSocket,所以,對於NodeJS不做過多的介紹,不太熟悉的朋友可以去參考NodeJS入門指南(http://www.nodebeginner.org/index-zh-cn.html)。
安裝好NodeJS之後,我們需要安裝「ws」,也就是我們的WebSocket實現,安裝方法很簡單,在終端或者命令行中輸入:
npm install ws
,等待安裝完成就可以了。
接下來,我們需要啟動我們的WebSocket服務。首先,我們需要構建自己的HTTP伺服器,在NodeJS中構建一個簡單的HTTP伺服器很簡單,so easy。代碼如下:
var app = http.createServer(onRequest ).listen( 8888 );
onRequest()作為回調函數,它的作用是處理請求,然後做出響應,實際上就是根據接收的URL,在伺服器上查找相應的資源,最終返回給瀏覽器。
在構建了HTTP伺服器後,我們需要啟動WebSocket服務,代碼如下:
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer( { server : app } );
從代碼中可以看出,在初始化WebSocket服務時,把我們剛才構建好的HTTP實例傳遞進去就好。到這里,我們的服務端代碼差不多也就編寫完成了。

2、阿里雲伺服器上的socket伺服器和web伺服器如何開啟?

阿里雲的虛擬主機不支持websocket,原因是因為主機沒有獨立ip,並且都是一台物理機放N個網站,因此才不支持。
阿里雲的雲伺服器支持的。

3、Socket編程如何搭建一個外網可以訪問的伺服器

搭建外網訪問,首先你要有一台外網可訪問的伺服器,有以下幾種方法可以實現。
一、購買外網伺服器。由於伺服器端使用JAVA語言開發,所以外網伺服器操作系統可以是Linux或Windows,這個需要你花錢購買。如果只是測試,你可以選擇購買阿里雲的雲伺服器,非常便宜。
二、還有一種方法就是你通過花生殼之類的軟體進行映射你的網路,但花生殼對長城寬頻之類的網路支持不是特別好,如果需要很好的支持,那也需要花錢購買。
三、如果你是通過路由器上網,並且可以操作路由器許可權且使用的是電信或者是聯通的網路,那可以直接在路由器裡面做埠映射,這個你可以百度一下,有很多文章講的非常清楚,這里篇幅限制,就不貼了。
四、如果你是直接通過貓上網且使用電信或聯通寬頻,那可以直接使用本機外網IP訪問你的程序。
以上四種方法中,最穩定的還是購買外網伺服器,其它都會有各種問題,你可以選擇其中適合你的一種方法。希望能幫助到你

4、socket編程伺服器端接收數據

//服務端:
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
Thread mythread ;
Socket socket;
// 清理所有正在使用的資源。
protected override void Dispose( bool disposing )
{
 try
 {
socket.Close();//釋放資源
mythread.Abort ( ) ;//中止線程
 }
 catch{ }
 if( disposing )
 {
if (components != null)
{
 components.Dispose();
}
 }
 base.Dispose( disposing );
}
public static IPAddress GetServerIP()
{
 IPHostEntry ieh=Dns.GetHostByName(Dns.GetHostName());
 return ieh.AddressList[0];
}
private void BeginListen()
{
 IPAddress ServerIp=GetServerIP();
 IPEndPoint iep=new IPEndPoint(ServerIp,8000);
 socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
 byte[] byteMessage=new byte[100];
 this.label1.Text=iep.ToString();
 socket.Bind(iep);
 // do
 while(true)
 {
try
{
 socket.Listen(5);
 Socket newSocket=socket.Accept();
 newSocket.Receive(byteMessage);
 string sTime = DateTime.Now.ToShortTimeString ( ) ;
 string msg=sTime+":"+"Message from:";
 msg+=newSocket.RemoteEndPoint.ToString()+Encoding.Default.GetString(byteMessage);
 this.listBox1.Items.Add(msg);
 }
catch(SocketException ex)
{
 this.label1.Text+=ex.ToString();
}
 } // while(byteMessage!=null);
}
//開始監聽
private void button1_Click(object sender, System.EventArgs e)
{
 try
 {
mythread = new Thread(new ThreadStart(BeginListen));
mythread.Start();
 }
 catch(System.Exception er)
 {
MessageBox.Show(er.Message,"完成",MessageBoxButtons.OK,MessageBoxIcon.Stop);
 }
}
//客戶端:
using System.Net;
using System.Net.Sockets;
using System.Text;
private void button1_Click(object sender, System.EventArgs e)
{
 BeginSend();
}
private void BeginSend()
{
 string ip=this.txtip.Text;
 string port=this.txtport.Text;
 IPAddress serverIp=IPAddress.Parse(ip);
 int serverPort=Convert.ToInt32(port);
 IPEndPoint iep=new IPEndPoint(serverIp,serverPort);
 byte[] byteMessage;
 Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
 socket.Connect(iep);
 byteMessage=Encoding.ASCII.GetBytes(textBox1.Text);
 socket.Send(byteMessage);
 socket.Shutdown(SocketShutdown.Both);
 socket.Close();
}

//基於TCP協議的發送和接收端
//TCP協議的接收端
using System.Net.Sockets ; //使用到TcpListen類
using System.Threading ; //使用到線程
using System.IO ; //使用到StreamReader類

int port = 8000; //定義偵聽埠號
private Thread thThreadRead; //創建線程,用以偵聽埠號,接收信息
private TcpListener tlTcpListen; //偵聽埠號
private bool blistener = true; //設定標示位,判斷偵聽狀態
private NetworkStream nsStream; //創建接收的基本數據流
private StreamReader srRead;
private System.Windows.Forms.StatusBar statusBar1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.ListBox listBox1; //從網路基礎數據流中讀取數據
private TcpClient tcClient ;
private void Listen ( )
{
 try
 {
tlTcpListen = new TcpListener ( port ) ; //以8000埠號來初始化TcpListener實例
tlTcpListen.Start ( ) ; //開始監聽
statusBar1.Text = "正在監聽" ;
tcClient = tlTcpListen.AcceptTcpClient ( ) ; //通過TCP連接請求
nsStream = tcClient.GetStream ( ) ; //獲取用以發送、接收數據的網路基礎數據流
srRead=new StreamReader(nsStream);//以得到的網路基礎數據流來初始化StreamReader實例
statusBar1.Text = "已經連接!";
while( blistener ) //循環偵聽
{
 string sMessage = srRead.ReadLine();//從網路基礎數據流中讀取一行數據
 if ( sMessage == "STOP" ) //判斷是否為斷開TCP連接控制碼
 {
tlTcpListen.Stop(); //關閉偵聽
nsStream.Close(); //釋放資源
srRead.Close();
statusBar1.Text = "連接已經關閉!" ;
thThreadRead.Abort(); //中止線程
return;
 }
 string sTime = DateTime.Now.ToShortTimeString ( ) ; //獲取接收數據時的時間
 listBox1.Items.Add ( sTime + " " + sMessage ) ;
}
 }
 catch ( System.Security.SecurityException )
 {
MessageBox.Show ( "偵聽失敗!" , "錯誤" ) ;
 }
}
//開始監聽
private void button1_Click(object sender, System.EventArgs e)
{
 thThreadRead = new Thread ( new ThreadStart ( Listen ) );
 thThreadRead.Start();//啟動線程
 button1.Enabled=false;
}
// 清理所有正在使用的資源。
protected override void Dispose( bool disposing )
{
 try
 {
tlTcpListen.Stop(); //關閉偵聽
nsStream.Close();
srRead.Close();//釋放資源
thThreadRead.Abort();//中止線程
 }
 catch{}
 if( disposing )
 {
if (components != null)
{
 components.Dispose();
}
 }
 base.Dispose( disposing );
}
//TCP協議的發送端
using System.Net.Sockets; //使用到TcpListen類
using System.Threading; //使用到線程
using System.IO; //使用到StreamWriter類
using System.Net; //使用IPAddress類、IPHostEntry類等

private StreamWriter swWriter; //用以向網路基礎數據流傳送數據 
private NetworkStream nsStream; //創建發送數據的網路基礎數據流 
private TcpClient tcpClient;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.StatusBar statusBar1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2; //通過它實現向遠程主機提出TCP連接申請 
private bool tcpConnect = false; //定義標識符,用以表示TCP連接是否建立

//連接 
private void button1_Click(object sender, System.EventArgs e)
{
 IPAddress ipRemote ;
 try
 {
ipRemote = IPAddress.Parse ( textBox1.Text ) ;
 }
 catch //判斷給定的IP地址的合法性
 {
MessageBox.Show ( "輸入的IP地址不合法!" , "錯誤提示!" ) ;
return ;
 }
 IPHostEntry ipHost ;
 try
 {
ipHost = Dns.Resolve ( textBox1.Text ) ; 
 }
 catch //判斷IP地址對應主機是否在線
 {
MessageBox.Show ("遠程主機不在線!" , "錯誤提示!" ) ;
return ;
 }
 string sHostName = ipHost.HostName ;
 try
 {
TcpClient tcpClient = new TcpClient(sHostName,8000);//對遠程主機的8000埠提出TCP連接申請
nsStream = tcpClient.GetStream();//通過申請,並獲取傳送數據的網路基礎數據流
swWriter = new StreamWriter(nsStream);//使用獲取的網路基礎數據流來初始化StreamWriter實例
button1.Enabled = false ;
button2.Enabled = true ;
tcpConnect = true ;
statusBar1.Text = "已經連接!" ;
 }
 catch
 {
MessageBox.Show ( "無法和遠程主機8000埠建立連接!" , "錯誤提示!" ) ;
return ;
 }
}

//發送
private void button2_Click(object sender, System.EventArgs e)
{
 if (textBox2.Text !="")
 {
swWriter.WriteLine(textBox2.Text);//刷新當前數據流中的數據
swWriter.Flush();
 }
 else
 {
MessageBox.Show("發送信息不能為空!","錯誤提示!");
 }
}
// 清理所有正在使用的資源。
protected override void Dispose( bool disposing )
{
 if ( tcpConnect )
 {
swWriter.WriteLine ( "STOP" ) ; //發送控制碼
swWriter.Flush (); //刷新當前數據流中的數據
nsStream.Close (); //清除資源
swWriter.Close ();
 }
 if( disposing )
 {
if (components != null)
{
 components.Dispose();
}
 }
 base.Dispose( disposing );

5、求tcp socket 客戶端的伺服器端的區別

服務在連接前監聽,客戶端主動發起連接,就著點區別。連接上後,兩者對等

6、TCP/IP 使用Socket 實現客戶端與伺服器端通信

對於伺服器,你先創建一個套接字(socket),然後bind綁定一個套接地址,然後你在用listen,此時你的伺服器會一直阻塞在這,處於監聽狀態,檢查是否有客戶端來connect,一旦有的話,你的伺服器就會accept。
所以,是你的伺服器是處於監聽狀態,監聽是否有客戶端,然後由客戶端來連接伺服器,伺服器接受客戶端的連接,而不是伺服器去連接客戶端。

7、一台伺服器最多可以連接多少socket

我對你問題的理解就是處於listen狀態的socket最多能accept()多少個連接,使其處於established狀態。
這個受本地環境(操作系統)的限制,我們知道一個socket會佔用一個文件描述符,所以:
1、打開多少個socket會受到操作系統對進程所打開文件描述符數量的限制。ulimit -n
2、操作系統自身也會對打開文件的總數量有限制,這個和當前機器內存環境有關。

8、請問socket伺服器與一般的伺服器有什麼不同

socket是綁定地址與埠的一個句柄,用來網路通訊的
java里,ServerSocket用於偵聽,Socket用於數據傳送
很多伺服器都是基於socket寫出來的,tomcat底層也用socket通訊

9、伺服器Socket Interface是什麼?

Socket介面是TCP/IP網路的API(Application Programming Interface,應用程序編程介面),Socket介面定義了許多函數或常式,程序員可以用它們來開發 TCP/IP網路上的應用程序。

請參閱以下資料:

socket非常類似於電話插座。以一個國家級電話網為例。電話的通話雙方相當於相互通信的2個進程,區號是它的網路地址;區內一個單位的交換機相當於一台主機,主機分配給每個用戶的局內號碼相當於socket號。任何用戶在通話之前,首先要佔有一部電話機,相當於申請一個socket;同時要知道對方的號碼,相當於對方有一個固定的socket。然後向對方撥號呼叫,相當於發出連接請求(假如對方不在同一區內,還要撥對方區號,相當於給出網路地址)。對方假如在場並空閑(相當於通信的另一主機開機且可以接受連接請求),拿起電話話筒,雙方就可以正式通話,相當於連接成功。雙方通話的過程,是一方向電話機發出信號和對方從電話機接收信號的過程,相當於向socket發送數據和從socket接收數據。通話結束後,一方掛起電話機相當於關閉socket,撤消連接。

在電話系統中,一般用戶只能感受到本地電話機和對方電話號碼的存在,建立通話的過程,話音傳輸的過程以及整個電話系統的技術細節對他都是透明的,這也與socket機制非常相似。socket利用網間網通信設施實現進程通信,但它對通信設施的細節毫不關心,只要通信設施能提供足夠的通信能力,它就滿足了。

至此,我們對socket進行了直觀的描述。抽象出來,socket實質上提供了進程通信的端點。進程通信之前,雙方首先必須各自創建一個端點,否則是沒有辦法建立聯系並相互通信的。正如打電話之前,雙方必須各自擁有一台電話機一樣。在網間網內部,每一個socket用一個半相關描述:

(協議,本地地址,本地埠)

一個完整的socket有一個本地唯一的socket號,由操作系統分配。

最重要的是,socket 是面向客戶/伺服器模型而設計的,針對客戶和伺服器程序提供不同的socket 系統調用。客戶隨機申請一個socket (相當於一個想打電話的人可以在任何一台入網電話上撥號呼叫),系統為之分配一個socket號;伺服器擁有全局公認的 socket ,任何客戶都可以向它發出連接請求和信息請求(相當於一個被呼叫的電話擁有一個呼叫方知道的電話號碼)。

socket利用客戶/伺服器模式巧妙地解決了進程之間建立通信連接的問題。伺服器socket 半相關為全局所公認非常重要。讀者不妨考慮一下,兩個完全隨機的用戶進程之間如何建立通信?假如通信雙方沒有任何一方的socket 固定,就好比打電話的雙方彼此不知道對方的電話號碼,要通話是不可能的。

與socket伺服器相關的知識