實現簡易的基於TCP IP 協議的聊天室

2021-10-08 02:03:16 字數 4178 閱讀 2400

專案描述:運用 socket 程式設計,實現了服務端對客戶端的廣播和**客戶端資訊實現客戶端聊天操作,並使用 i/o 復用技術中的 epoll 模式解決了乙個執行緒可以處理大量使用者連線伺服器的請求,提高了伺服器併發連線的數量。同時利用執行緒池來管理各個執行緒的工作,避免了建立和銷毀執行緒的開銷,因此使伺服器更加高效。

server伺服器:

// 一伺服器 ->  多客戶端

// 三次握手主要是建立連線

// 四次揮手主要是釋放資源

// i/o復用 epoll模式

#include

#include

#include

#include

// bzero()

#include

#include

// remove()

#include

#include

// max_element()

#include

// epoll()

#include

// open_max

using

namespace std;

void

show_connect

(int fd)

// ./server ip port

intmain

(int argc,

char

* ar**)

// 1. 監聽套接字

int listenfd =

socket

(af_inet,sock_stream,0)

;if(-

1== listenfd)

// 為了避免埠被占用,想要再次使用同乙個埠

// 設定埠重複利用(一般用在除錯中)

int flag =1;

setsockopt

(listenfd,sol_socket,so_reuseaddr,

&flag,

sizeof

(flag));

// 2. 繫結

struct sockaddr_in local_addr;

local_addr.sin_family = af_inet;

// ipv4協議

local_addr.sin_addr.s_addr =

inet_addr

(ar**[1]

);// ip位址

local_addr.sin_port =

htons

(atoi

(ar**[2]

));// 埠號if(

-1==bind

(listenfd,

(struct sockaddr*

)&local_addr,

sizeof

(local_addr)))

else

// 3. 監聽設定if(

-1==listen

(listenfd,10)

)else

int epollfd =

epoll_create

(inr_open_max)

;struct epoll_event evt;

evt.data.fd = stdin_fileno;

evt.events = epollin;

epoll_ctl

(epollfd,epoll_ctl_add,stdin_fileno,

&evt)

; evt.data.fd = listenfd;

epoll_ctl

(epollfd,epoll_ctl_add,listenfd,

&evt)

;int count =2;

list<

int> fds;

while

(true)}

}else

if(revt[i]

.data.fd == listenfd && revt[i]

.events & epollin)

else

}else

;int n =

read

(connfd,buffer,

1024);

// 讀取客戶端發過來的資訊

if(n ==0)

else}}

}}close

(epollfd)

;// 7. 關閉套接字

close

(listenfd)

;}

client客戶端:

// 三次握手主要是建立連線

// 四次揮手主要是釋放資源

// i/o 復用 epoll模式

#include

#include

#include

#include

// bzero()

#include

//#include

#include

// epoll()

#include

// open_max

using

namespace std;

string name;

void

show_connect

(int fd)

// ./clinet ip port name

intmain

(int argc,

char

* ar**)

name = ar**[3]

;// 1.建立連線套接字

int connfd =

socket

(af_inet,sock_stream,0)

;if(-

1== connfd)

// 2. 連線伺服器

struct sockaddr_in remote_addr;

// in是internet簡寫

remote_addr.sin_family = af_inet;

// 協議 sin是sockaddr_in的縮寫

remote_addr.sin_addr.s_addr =

inet_addr

(ar**[1]

);// ip位址

remote_addr.sin_port =

htons

(atoi

(ar**[2]

));// 埠號 小端轉大端if(

-1==connect

(connfd,

(struct sockaddr*

)&remote_addr,

sizeof

(remote_addr)))

else

// 建立epoll描述符

int epollfd =

epoll_create(2

);// 註冊事件

struct epoll_event evt;

evt.data.fd = stdin_fileno;

evt.events = epollin;

epoll_ctl

(epollfd,epoll_ctl_add,stdin_fileno,

&evt)

; evt.data.fd = connfd;

evt.events = epollin;

epoll_ctl

(epollfd,epoll_ctl_add,connfd,

&evt)

;bool stop =

false

;while

(!stop)

else

if(revt[i]

.data.fd == connfd && revt[i]

.events & epollin)

;int len =

read

(connfd,buffer,

sizeof

(buffer));

if(len ==0)

else}}

}close

(epollfd)

;// 5. 關閉套接字

close

(connfd)

;return0;

}

基於TCP IP協議的網路程式設計

基於tcp ip協議的網路程式設計 定義變數 獲得winsock版本 載入winsock庫 初始化 建立套接字 設定套接字選項 關閉套接字 解除安裝winsock庫 釋放所有資源 整個程式架構分為兩大部分,伺服器端客戶端。伺服器socket程式流程 socket bind listen accept...

基於java的TCP IP協議理解

tcp ip協議的工作流程如下 在源主機上,應用層將一串應用資料流傳送給傳輸層。傳輸層將應用層的資料流截成分組,並加上tcp報頭形成tcp段,送交網路層。在網路層給tcp段加上包括源 目的主機ip位址的ip報頭,生成乙個ip資料報,並將ip資料報送交鏈路層。鏈路層在其mac幀的資料部分裝上ip資料報...

基於TCP IP協議實現檔案傳輸

public class fileserver extends thread override public void run 將map集合傳送到客戶端 oos.writeobject map oos.flush 2.接收客戶端傳送的檔案序號 scanner sc new scanner s.get...