導航:首頁 > 編程語言 > socketio編程

socketio編程

發布時間:2022-09-02 15:55:48

A. nodejs的socket.io的廣播機制是怎樣的

node.js提供了高效的服務端運行環境,但是由於瀏覽器端對HTML5的支持不一,為了兼容所有瀏覽器,提供卓越的實時的用戶體驗,並且為程序員提供客戶端與服務端一致的編程體驗,於是socket.io誕生。
socket.io設計的目標是支持任何的瀏覽器,任何Mobile設備。目前支持主流的PC瀏覽器 (IE,Safari,Chrome,Firefox,Opera等),Mobile瀏覽器(iphone Safari/ipad Safari/android WebKit/WebOS WebKit等)。socket.io基於node.js並簡化了WebSocket API,統一了通信的API。它支持:WebSocket, Flash Socket, AJAX long-polling, AJAX multipart streaming, Forever IFrame, JSONP polling。
socket.io解決了實時的通信問題,並統一了服務端與客戶端的編程方式。啟動了socket以後,就像建立了一條客戶端與服務端的管道,兩邊可以互通有無。

B. Socket編程,為什麼客戶端無法接收來自伺服器的數據

如題,我寫了段Socket伺服器\客戶端通訊的程序,服務端能接收到客戶端的數據,但是客戶端就無法接收到服務端傳回的數據,代碼如下Server端import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * @author Think * */ public class SocketServer { /** * @param args */ public static void main(String[] args) { new SocketServer().start(); } public void start(){ try { ServerSocket server = new ServerSocket(10086); while(true){ System.out.println("Waiting for a client..."); Socket client = server.accept(); new SocketServerThread(client).start(); } } catch (IOException e) { e.printStackTrace(); } } class SocketServerThread extends Thread{ Socket client = null; public SocketServerThread(Socket client){ this.client = client; } @Override public void run(){ try { // 得到CLIENT的輸入流,從輸入流出取出傳輸的數據 BufferedReader reader_from_client = new BufferedReader(new InputStreamReader(client.getInputStream())); String line = null; System.out.print("from client message:"); while((line = reader_from_client.readLine()) != null){ System.out.println(line); } // 得到CLIENT端的輸入流,通過向CLIENT傳輸數據 PrintWriter writer_to_client = new PrintWriter(client.getOutputStream()); writer_to_client.println("Ok"); writer_to_client.flush(); reader_from_client.close(); writer_to_client.close(); client.close(); } catch (IOException e) { } } } } Client
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; /** * @author Think * */ public class SocketClient { /** * @param args */ public static void main(String[] args) { try { Socket remoteServer = new Socket(InetAddress.getLocalHost(), 10086); // 得到SERVER端SOCKET的輸出流,通過向輸出流寫入數據,與SERVER進行通信 PrintWriter write_to_server = new PrintWriter(remoteServer.getOutputStream(), true); write_to_server.write("Hello, what's you name?"); write_to_server.flush(); // 把下面這幾行放開,SERVER端就收不到數據了,一直處於阻塞狀態 // 得到SERVER端的輸出流,從輸出流中讀取從SERVER傳遞來的數據 // BufferedReader reader_from_server = new BufferedReader(new InputStreamReader(remoteServer.getInputStream())); // String line = null; // while((line = reader_from_server.readLine()) != null){ // System.out.println(line); // } // reader_from_server.close(); write_to_server.close(); remoteServer.close(); } catch (IOException e) { e.printStackTrace(); } } }如果Client中的說明,只要是Client中放開了
BufferedReader reader_from_server = new BufferedReader(new InputStreamReader(remoteServer.getInputStream())); String line = null; while((line = reader_from_server.readLine()) != null){ System.out.println(line); } reader_from_server.close(); 這段代碼,SERVER就阻塞在
while((line = reader_from_client.readLine()) != null){ 這行,不知道是哪個環節理解或處理錯了,還望大家指點指點!
即使不關閉連接,也是取不到數據,看了下其它類似的提問,問題在於readLine()會導致阻塞,還在摸索解決的辦法! 問題補充:wgy_superpower 寫道第一:Socket編程時,永遠不要在關閉寫(writer)之前關閉讀(reader)
第二:不管是客戶端還是服務端在通過Socket讀取數據的時候,在你的數據傳輸完成後,發送一個結束標記(比如:end),這樣在你的 while循環裡面判斷一下數據是否已經傳輸完畢,完畢後跳出循環,否則由於你的程序就會一直阻塞在 readLine()這里,因為你的 socket還沒有斷開,會一直等待你寫數據。
你說的有道理,經過後來的試驗,確實是因為readLine()一直等待著客戶端的輸入,但此時客戶端也在等待服務端的返回,所以導致兩邊都在那等待,就阻塞了。
一句話就是,一直【等待寫數據】,但又沒有數據寫入,所以就卡住了。 問題補充:anranran 寫道SocketServer : while((line = reader_from_client.readLine()) != null)
這個在socket沒有關閉的時候是無法輸出來的。
所以Server do not send any data to client嗯,也有道理,但主要不是socket沒有關閉,而是沒有向流中寫數據,而readLine()又一直在那讀取,所以就阻塞了!

C. socket編程到底是什麼

socket 其實就是操作系統提供給程序員操作「網路協議棧」的介面,說人話就是,你能通過socket 的介面,來控制協議找工作,從而實現網路通信,達到跨主機通信。

協議棧的上半部分有兩塊,分別是負責收發數據的 TCP 和 UDP 協議,它們兩會接受應用層的委託執行收發數據的操作。

協議棧的下面一半是用 IP 協議控制網路包收發操作,在互聯網上傳數據時,數據會被切分成一塊塊的網路包,而將網路包發送給對方的操作就是由 IP 負責的。這里需要注意的是,服務端調用 accept 時,連接成功了會返回一個已完成連接的 socket,後續用來傳輸數據。

所以,監聽的 socket 和真正用來傳送數據的 socket,是「兩個」 socket,一個叫作監聽 socket,一個叫作已完成連接 socket。成功連接建立之後,雙方開始通過 read 和 write 函數來讀寫數據,就像往一個文件流裡面寫東西一樣。

D. 如何為可擴展系統進行Socket編程

Java I/O示例第部:HTTP客戶端 通簡短例看何執行HTTP GET獲取HTTP服務HTTP比本例更加復雜熟我寫客戶端代碼處理簡單案例發請求伺服器端獲取資源同伺服器端返響應並關閉流本案例所需步驟: 創建埠80中國絡伺服器所應客戶端Socket 伺服器端獲取PrintStream同發送GET PATH HTTP/1.0請求其PATH伺服器請求資源比假設想打中國站根目錄path / 獲取伺服器端InputStream用BufferedReader其包裝按行讀取響應 列表1、 SimpleSocketClientExample.java package 中國.geekcap.javaworld.simplesocketclient; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintStream; import java中國.Socket; public class SimpleSocketClientExample { public static void main( String[] args ) { if( args.length < 2 ) { System.out.println( "Usage: SimpleSocketClientExample " ); System.exit( 0 ); } String server = args[ 0 ]; String path = args[ 1 ]; System.out.println( "Loading contents of URL: " + server ); try { // 創建與埠80中國絡伺服器應客戶端socket Socket socket = new Socket( server, 80 ); //伺服器端獲取PrintStream PrintStream out = new PrintStream( socket.getOutputStream() ); //獲取伺服器端InputStream用BufferedReader其包裝 BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); //發送GET PATH HTTP/1.0請求伺服器端 out.println( "GET " + path + " HTTP/1.0" ); out.println(); //按行讀取伺服器端返響應數據 String line = in.readLine(); while( line != null ) { System.out.println( line ); line = in.readLine(); } // 關閉流 in.close(); out.close(); socket.close(); } catch( Exception e ) { e.printStackTrace(); } } } 列表1接受兩命令行參數:需要連接伺服器需要取資源創建Socket指向伺服器端並且顯式其指定埠號80接著程序指向命令: GET PATH HTTP/1.0 比 GET / HTTP/1.0 頂部 程發 准備web伺服器獲取中國頁比 中國google中國 HTTP client利用DNS伺服器獲取伺服器址:高域名伺服器始查詢中國域名哪存 中國google中國 權威域名伺服器接著 HTTP client詢問域名伺服器 中國google中國 IP址接打Socket通向埠80伺服器 HTTP Client執行特定HTTP比GET、POST、PUT、DELETE、HEAD 或者OPTI/ONS每種都自語述代碼列表GET面依需要path、HTTP/版本號、空行想加入 HTTP headers我必須進入新行前完 列表1獲取 OutputStream並用 PrintStream 包裝我能容易執行基於文本命令 同 InputStream 獲取代碼InputStreamReader 包裝流轉化Reader再用 BufferedReader 包裝我能用PrintStream執行GET用BufferedReader 按行讀取響應直獲取響應 null 結束關閉Socket 現我執行類傳入參數: java 中國.geekcap.javaworld.simplesocketclient.SimpleSocketClientExample 中國javaworld中國 / 應該能夠看類似面輸: Loading contents of URL: 中國javaworld中國 HTTP/1.1 200 OK Date: Sun, 21 Sep 2014 22:20:13 GMT Server: Apache X-Gas_TTL: 10 Cache-Control: max-age=10 X-GasHost: gas2.usw X-Cooking-With: Gasoline-Local X-Gasoline-Age: 8 Content-Length: 168 Last-Modified: Tue, 24 Jan 2012 00:09:09 GMT Etag: "60001b-a8-4b73af4bf3340" Content-Type: text/html Vary: Accept-Encoding Connection: close

Success 本輸顯示JavaWorld中國站測試頁面中國頁HTTP version 1.1響應200 OK. Java I/O示例第二部:HTTP伺服器 剛才我說客戶端幸運伺服器端通信容易簡單視角看處理程: 創建ServerSocket並指定監聽埠 調用 ServerSocket accept() 監聽自客戶端連接 旦客戶端連接伺服器accept() 通伺服器與客戶端通信返Socket客戶端用同Socket類處理程相同獲取 InputStream 讀取客戶端信息OutputStream 寫數據客戶端 伺服器需要擴展需要Socket傳給其線程處理伺服器持續監聽連接 再調用 ServerSocket accept() 監聽其連接 所看NIO處理場景略同直接創建ServerSocket並埠號傳給用於監聽(關於 ServerSocketFactory 更信息面討論): ServerSocket serverSocket = new ServerSocket( port ); 通 accept() 接收傳入連接: Socket socket = serverSocket.accept(); // 處理連接…… 頂部 線程Socket編程 列表2所伺服器代碼放起組更加健壯例本例線程處理請求伺服器ECHO伺服器說所接收消息返 列表2例復雜已經提前介紹部NIO內容線程代碼花費些精力構建處理並發請求伺服器 列表2、SimpleSocketServer.java package 中國.geekcap.javaworld.simplesocketclient; import java.io.BufferedReader; import java.io.I/OException; import java.io.InputStreamReader; import java.io.PrintWriter; import java中國.ServerSocket; import java中國.Socket; public class SimpleSocketServer extends Thread { private ServerSocket serverSocket; private int port; private boolean running = false; public SimpleSocketServer( int port ) { this.port = port; } public void startServer() { try { serverSocket = new ServerSocket( port ); this.start(); } catch (I/OException e) { e.printStackTrace(); } } public void stopServer() { running = false; this.interrupt(); } @Override public void run() { running = true; while( running ) { try { System.out.println( "Listening for a connection" ); // 調用 accept() 處理連接 Socket socket = serverSocket.accept(); // 向 RequestHandler 線程傳遞socket象進行處理 RequestHandler requestHandler = new RequestHandler( socket ); requestHandler.start(); } catch (I/OException e) { e.printStackTrace(); } } } public static void main( String[] args ) { if( args.length == 0 ) { System.out.println( "Usage: SimpleSocketServer " ); System.exit( 0 ); } int port = Integer.parseInt( args[ 0 ] ); System.out.println( "Start server on port: " + port ); SimpleSocketServer server = new SimpleSocketServer( port ); server.startServer(); // 1鍾自關閉 try { Thread.sleep( 60000 ); } catch( Exception e ) { e.printStackTrace(); } server.stopServer(); } } class RequestHandler extends Thread { private Socket socket; RequestHandler( Socket socket ) { this.socket = socket; } @Override public void run() { try { System.out.println( "Received a connection" ); // 獲取輸入輸流 BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); PrintWriter out = new PrintWriter( socket.getOutputStream() ); // 向客戶端寫信息 out.println( "Echo Server 1.0" ); out.flush(); // 向客戶端寫信息直客戶端關閉連接或者收空行 String line = in.readLine(); while( line != null && line.length() > 0 ) { out.println( "Echo: " + line ); out.flush(); line = in.readLine(); } // 關閉自連接 in.close(); out.close(); socket.close(); System.out.println( "Connection closed" ); } catch( Exception e ) { e.printStackTrace(); } } } 列表2我創建新 SimpleSocketServer 實例並啟伺服器繼承 Thread SimpleSocketServer 創建新線程處理存於 run() 阻塞 accept() 調用 run() 存循環用接收客戶端請求並創建RequestHandler線程處理些請求再強調相簡單編程涉及相線程編程 RequestHandler 處理客戶端通信代碼與列表1相似:PrintStream 包裝 OutputStream 更容易進行寫操作同 BufferedReader 包裝InputStream 更易於讀取要伺服器跑RequestHandler 客戶端信息按行讀取並返給客戶端客戶端發空行結束RequestHandler 關閉Socke

E. 什麼是socket網路編程

使用socket套接字,利用TCP/IP或者UDP協議,實現幾個機器之間的通信。一般使用C/S結構。
以TCP/IP為例:首先建立一個伺服器,步驟如下:socket()創建一個socket,bind()綁定socket到一個埠,listen()監聽埠,accept()等待客戶端的連接。客戶端程序:socket()創建一個socket,可以綁定也可以不綁定,然後connect()連接到伺服器端。socket又分為阻塞式的和非阻塞式的。阻塞式的就是伺服器端等待連接直到連接上,不然一直掛起。

F. 什麼是socket編程

socket 就是插座, 你想啊一旦插上插座線路就通了, 信息就可以傳送了, socket攜帶了你要發送的數據。
所謂socket編程, 就是調用系統提供的封裝好的socket API 實現底層的網路通信, 具體的話您可以去看看這個:
http://ke..com/view/13870.htm

G. 怎樣用C語言做socket網路編程

mfc只是對socket進行了一些封裝,大部分人做網路編程都是用的原始的socket,比如如下介面都可以在c下進行調用
1.socket()
2.bind()
3.connect()
4.listen()
5.accept()
6.send() 和recv()
7.sendto() 和recvfrom()
8.close() 和shutdown()
9.getpeername()
10.gethostname()
這些介面是在Winsock2.h中定義的不是在mfc中定義的,你只需要包含Winsock2.h頭文件和Ws2_32.lib庫就可以了。

H. socket.io node.js 可以負載均衡嗎

我們在用 Node.js 處理知乎主站的 web 實時推送。你現在看到的 Feed 、消息的實時更新,背後就是幾個 node 進程扛起來的。

優點:

1. 處理高並發場景性能更高

在用 socket.io 之前,推送服務是用 ajax polling 做的。我們用 Tornado 和 Node.js 做過兩個版本的推送服務。在當時的測試環境下,Node.js 的 CPU 時間是 Tornado 的三分之一,內存使用是 Tornado 的一半,代碼行數只有 Tornado 的三分之一(Node.js 版是用 coffee 寫的)。後來我們使用了 socket.io,CPU 開銷進一步降低。

2. 函數式編程非常適合寫非同步回調鏈

用 Node.js 配合 CoffeeScript 寫非同步操作鏈非常便利,相比之下 Tornado 無論是寫命名函數的回調,還是 yield 一個 Task 都沒那麼自然。

缺點:

1. 大量匿名函數使異常棧變得不好看。
2. 無法以 request 為單位 catch 異常,必須確保不要在不 catch 異常的第三方庫的回調里的拋異常,這在一個非同步操作鏈條里是一件比較麻煩的事。解決方法之一是對那些不 catch 異常的第三方庫做一些封裝,把所有的異常變成事件,改成 on('error') 形式的 API。

I. 請問Socket編程的基本步驟是怎樣的最好能寫一個簡單的程序Java演示一下,主要是接受數據。謝謝!

SERVER端:
--------------------------------------------------------
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;

{
privateSocketclientSocket;

publicServer(SocketclientSocket){
this.clientSocket=clientSocket;
}

publicvoidrun(){
DataInputStreamdis=null;
DataOutputStreamdos=null;

try{
dis=newDataInputStream(clientSocket.getInputStream());
dos=newDataOutputStream(clientSocket.getOutputStream());

while(true){
Stringtemp=dis.readUTF();
if("over".equals(temp)){
break;
}
dos.writeUTF("fromserver:"+temp);
}

}catch(Exceptione){
e.printStackTrace();
}finally{
try{
if(dis!=null){
dis.close();
}
if(dis!=null){
dos.close();
}

if(clientSocket!=null){
clientSocket.close();
}
}catch(IOExceptione){
}
}
}

publicstaticvoidmain(String[]args)throwsException{
ServerSocketss=newServerSocket(8008);
while(true){
SocketclientSocket=ss.accept();
//針對每個客戶端,啟一個Server線程專門處理此客戶端的請求。
Serverserver=newServer(clientSocket);
server.start();
}

}

}

CLIENT端:
----------------------------------------
importjava.io.BufferedReader;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.InputStreamReader;
importjava.net.Socket;

publicclassClient{

publicstaticvoidmain(String[]args)throwsException{
//輸入流1,從鍵盤進入Client。
InputStreamReaderisr=newInputStreamReader(System.in);
BufferedReaderbr=newBufferedReader(isr);

SocketclientSocket=newSocket("127.0.0.1",8008);

//輸入流2,從伺服器端進入Client的流對象。
DataInputStreamdis=newDataInputStream(clientSocket.getInputStream());

//輸出流,從Client出去,到伺服器端。
DataOutputStreamdos=newDataOutputStream(clientSocket.getOutputStream());

while(true){
//從鍵盤輸入讀取
Stringmsg=br.readLine();

//將讀取信息發送給伺服器端
dos.writeUTF(msg);

//輸入QUIT退出
if("QUIT".equals(msg)){
break;
}

//讀取從伺服器返回的信息
Stringtemp=dis.readUTF();
System.out.println(temp);
}

br.close();
dis.close();
dos.close();
clientSocket.close();
}
}

閱讀全文

與socketio編程相關的資料

熱點內容
向某人下命令 瀏覽:625
編程中刪除數組中的數 瀏覽:84
aes對稱加密反編譯 瀏覽:548
java編譯成exe 瀏覽:188
gps處理演算法 瀏覽:594
什麼app可以和對象存錢 瀏覽:144
java字元串表達式計算 瀏覽:328
javacmd環境變數 瀏覽:49
電視上面找不到全民歌app怎麼辦 瀏覽:154
單片機中psw0 瀏覽:992
優酷視頻加密么 瀏覽:761
本地連接dos命令 瀏覽:204
雲伺服器怎麼上傳金幣房卡游戲 瀏覽:69
Python快遞管理可視化 瀏覽:417
java正則驗證數字 瀏覽:828
猴子網游安卓掃碼怎麼登錄 瀏覽:355
7天工作總結簡短程序員 瀏覽:60
手機號交易網站源碼 瀏覽:687
計算機演算法怎麼學 瀏覽:401
m2手環用什麼app才能用 瀏覽:227