程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 基於多線程的TCP服務器項目【開源】,多線程tcp開源

基於多線程的TCP服務器項目【開源】,多線程tcp開源

編輯:C#入門知識

基於多線程的TCP服務器項目【開源】,多線程tcp開源


本文提供一個完整的TCP Server實例,包括動態連接庫、單元測試、驗收測試、Winform模擬測試。供新手學習,還望老手多提意見。

項目地址:https://tcpserversocket.codeplex.com/ (可直接Download項目工程)

系統結構

項目文件如下:

TcpServerSocket:項目核心動態鏈接庫,如果在別的項目中使用,只用引用該項目生成的DLL即可;

WindowsFormsApplication1:一個簡單的winform應用程序,讓你快事了解如何在WinForm中使用;

UnitTestProject:單元測試;

AcceptanceTest:驗收測試,模擬高速連接斷開的客戶端,快速數據發送。

 

項目的核心是使用TcpListener進行監聽,使用NetworkStream進行TCP數據流讀寫。服務器的核心原理如下圖:

 

  

系統測試

WindowsFormsApplication1 + 網絡調試助手測試效果:

 WindowsFormsApplication1 + AcceptanceTest效果:

 

如何使用

可以在你的項目中添加生成的TcpServerSocket.dll,然後簡單幾句代碼就可以開啟TCP Server之旅!

 var tcp = new TcpServer
 {
     RecvNewClientAction = handler => Debug.WriteLine("recv new client: " + handler),
     LostClientAction = handler => Debug.WriteLine("lost client :" + handler),
      RecvDataAction = (ip, data, len) => Debug.WriteLine("{0}:{1}", ip, Encoding.ASCII.GetString(data, 0, len)),
     ListenPort = 8080
 };
 tcp.StartListen();


後續開發

程序主要一個問題是處理斷網、客戶端程序突然崩潰等非正常斷線情況。本來是想在程序中加心跳處理,但這樣的話就增加了程序的復雜性。希望各位大大們指點迷津!


設計一個linux c語言,基於TCP的多線程服務器與客戶端發送程 序

客戶端
#include <stdio.h>

#include <unistd.h>

#include <strings.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#define PORT 1234

#define MAXDATASIZE 1000

void process(FILE *fp,int sockfd);

char *getMessage(char *sendline,int len,FILE *fp);

int main(int argc,char *argv[])

{

int fd;

struct hostent *he;

struct sockaddr_in server;

if(argc!=2)

{

printf("Usage: %s <IP Address>\n",argv[0]);

exit(1);

}

if((he=gethostbyname(argv[1]))==NULL)

{

printf("gethostbyname error.\n");

exit(1);

}

if((fd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

perror("socket() error.\n");

exit(1);

}

bzero(&server,sizeof(server));

server.sin_family=AF_INET;

server.sin_port=htons(PORT);

server.sin_addr=*((struct in_addr *)he->h_addr);

if(connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1)

{

perror("connect() error.\n");

exit(1);

}

process(stdin,fd);

close(fd);

}

void process(FILE *fp,int sockfd)

{

char sendbuf[MAXDATASIZE];

char recvbuf[MAXDATASIZE];

int num;

printf("Input your name:\n");

if(fgets(sendbuf,MAXDATASIZE,fp)==NULL)

{

printf("lease enter your name,now you have exit.\n");

return;

}

send(sockfd,sendbuf,strlen(sendbuf),0);

while(getMessage(sendbuf,MAXDATASIZE,fp)!=NULL)

{

send(sockfd,sendbuf,strlen(sendbuf),0);

if((num=recv(sockfd,recvbuf,MAXDATASI......余下全文>>
 

一個C#多線程實現TCP協議的SCOKET編程

zhidao.baidu.com/...4.html

我以前的一個回答。
只有服務器端沒有客戶端,僅供參考。

思路是用某個標識(我用的字符串)識別每個socket是什麼客戶端,然後在需要轉發消息的時候,從收到數據的socket得知是從哪個客戶端發來的,從消息裡“發送目標”得知要從哪個socket發出去,然後發就可以了
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved