用Socket做乙個區域網聊天工具

2021-08-30 20:12:06 字數 2832 閱讀 2218

程式設計成為簡單的服務端和客戶端之間的通訊, 但通過一些方法可以將這兩者進行統一起來, 讓服務端也成為客戶端, 讓客戶端也成為服務端, 使它們之間可以互相隨時不間斷的通訊. 考慮到實現最原始的服務端和客戶端之間的通訊所需要的步驟對於寫這樣的程式是很有幫助的.

作為服務端, 要宣告乙個socket a並繫結(bind)某乙個ip+這個ip指定的通訊埠, 比如這個是127.0.0.1:9050, 然後開始監聽(listen), listen可以監聽來自多個ip傳過來的連線請求, 具體可以同時連線幾個客戶端, listen方法中可以設定乙個引數. 如果listen到某乙個客戶端發來連線請求了, 這時定義乙個新的socket b專門負責與這個客戶端的通訊, socket b = a.accept(). 這時可以獲取這個客戶端的ip和埠,  ipendpoint c = (ipendpoint)b.remoteendpoint, c.address和c.port分別表示客戶端c的ip位址和埠. 這時通過b.send()方法就可以給c傳送訊息了, b.receive()可以接收客戶端c發來的資訊.

作為客戶端, 也需要宣告乙個socket d並繫結某乙個ip+本機乙個未被占用的埠, 定義ipendpoint e表示要進行連線的服務端socket, 要指明e的ip和埠, 這樣才可以進行埠對埠之間的通訊, 接下來就可以嘗試d.connect(e), 連線成功之後就可以傳送和接收資料了, d.send(), d.receive.

傳送訊息時, 資料都是以位元組或位元組陣列為單位進行傳輸的, 比如我客戶端d要傳送"hello world"則要這樣寫: d.send(encoding.ascii.getbytes("hello world")).  接受訊息時, 也是以位元組或位元組陣列, 比如服務端要接受d剛才傳送的hello world, 可以這樣寫: byte data = new byte[1024]; int receiveddatalength = b.receive(data); string stringdata = encoding.ascii.getstring(data, 0, receiveddatalength); stringdata這時就是hello world.

上面只是大概的闡述了服務端與客戶端之間的通訊過程, 在網上找到了具體的**例子, 也貼過來參考參考. 這個例子沒有將服務端與客戶端統一起來, 他是分別寫服務端和客戶端的.

服務端:

using  system;

using  system;

using  system.net;

using  system.net.sockets;

using  system.text;

namespace  tcpserver

///  

///  class1 的摘要說明。

///  

class  server

///  

///  應用程式的主入口點。

///  

[stathread]

static   void  main( string args)

//  todo: 在此處新增**以啟動應用程式

int  recv; // 用於表示客戶端傳送的首席資訊官度

byte data;// = new   byte [ 1024 ]; // 用於快取客戶端所傳送的資訊,通過socket傳遞的資訊必須為位元組陣列

ipendpoint ipep = new  ipendpoint(ipaddress.any, 9050 ); // 本機預使用的ip和埠

socket newsock = new  socket(addressfamily.internetwork,sockettype.stream,protocoltype.tcp);

newsock.bind(ipep); // 繫結

newsock.listen( 10 ); // 監聽

console.writeline( " waiting for a client  " );

socket client = newsock.accept(); //當有可用的客戶端連線嘗試時執行,並返回乙個新的socket,用於與客戶端之間的通訊

ipendpoint clientip = (ipendpoint)client.remoteendpoint;

console.writeline( " connect with client: " + clientip.address + "  at port: " + clientip.port);

string  welcome = " welcome here! " ;

data = encoding.ascii.getbytes(welcome);

client.send(data,data.length,socketflags.none); // 傳送資訊

while ( true )

{ // 用死迴圈來不斷的從客戶端獲取資訊

data = new   byte [ 1024 ];

recv = client.receive(data);

console.writeline( " recv= " + recv);

if  (recv == 0 ) // 當首席資訊官度為0,說明客戶端連線斷開

break ;

console.writeline(encoding.ascii.getstring(data, 0 ,recv));

client.send(data,recv,socketflags.none);

console.writeline( " disconnected from " + clientip.address);

client.close();

newsock.close();

tag標籤: 區域網 聊天 socket

寫的乙個區域網聊天程式

主要用到了,tcpserver和tcpclinet的,基本功能已經實現,可能裡面有需要完善的地方,希望有興趣的人去完善吧。伺服器裡有斷 如下 procedure tform1.itstalkexecute athread tidpeerthread begin acceptstr athread.c...

自己動手做乙個區域網聊天工具(一)

socket 程式設計。現在談談我對 socket 的理解。socket 的中文翻譯叫插座。我感覺這個翻譯很形象。socket 可以理解為一種連線物件,就是把服務端和客戶端都連線起來的物件。具體就是假如服務端和客戶端要連線起來,就是服務端和客戶端都要建立乙個 socket 物件,然後二者通過 soc...

用L指令碼語言開發乙個簡單的區域網聊天程式

scp 這是乙個簡單的區域網聊天程式的例子 定義 字串,string1 定義 字串,string2 addr1是對方的位址 addr2是自己的位址 如果addr1和addr2相同,就是自己和自己聊天 定義 位址,addr1,127.0.0.1,27015 定義 位址,addr2,127.0.0.1,...