socket实现多个客户端连接在一个服务器上
2012-08-30 15:06
615 查看
1、使用socekt通信一般步骤
1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。
2)客户端:socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。
3)服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。
2、多个客户端同时连接在一个服务器上
这时候服务器端应该使用多线程,每连接上一个客户端就给该客户端开启一个线程。监听端口的时候也要单独开一个线程、不然会阻塞主线程。这样做有一个明显的缺点,就是有N个客户端请求连接时,就会有N个线程,对程序的性能和计算机的性能影响很大,可以使用线程池进行管理。
使用线程池的好处:主要用于减少因频繁创建和销毁线程带来开销,因此那些经常使用且执行时间短的线程需要用线程池来管理。
3、C#版代码如下
服务器端代码:
客户端代码:
1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。
2)客户端:socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。
3)服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。
2、多个客户端同时连接在一个服务器上
这时候服务器端应该使用多线程,每连接上一个客户端就给该客户端开启一个线程。监听端口的时候也要单独开一个线程、不然会阻塞主线程。这样做有一个明显的缺点,就是有N个客户端请求连接时,就会有N个线程,对程序的性能和计算机的性能影响很大,可以使用线程池进行管理。
使用线程池的好处:主要用于减少因频繁创建和销毁线程带来开销,因此那些经常使用且执行时间短的线程需要用线程池来管理。
3、C#版代码如下
服务器端代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO; namespace SockServer { class Program { static void Main(string[] args) { try { //把ip地址转换为实例 IPAddress ipa = IPAddress.Parse("127.0.0.1"); //监听端口8001 TcpListener mylsn = new TcpListener(ipa, 8001); //开启监听 mylsn.Start(); //输出监听成功的信息 Console.WriteLine("在8001启动服务,等待连接"); //等待处理接入连接请求 while (true) { Socket mysock = mylsn.AcceptSocket(); Console.WriteLine("有连接,连接来自" + mysock.RemoteEndPoint); work w = new work(); w.mysock = mysock; w.mylsn = mylsn; Thread t = new Thread(new ThreadStart(w.main)); t.Start(); } } catch { } finally { } } } class work { public Socket mysock; public TcpListener mylsn; public void main() { //接收客户端消息 byte[] data = new byte[100]; mysock.Receive(data); string rt = System.Text.UTF8Encoding.UTF8.GetString(data); Console.WriteLine(rt); //给客户端发消息 mysock.Send(UTF8Encoding.UTF8.GetBytes("server callback")); //释放资源 mysock.Close(); mylsn.Stop(); } } }
客户端代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO; namespace SockClient { class Program { public static void Main() { //新建客户端套接字 TcpClient tclient = new TcpClient(); //连接服务器 tclient.Connect("127.0.0.1", 8001); Console.WriteLine("输入要发送的消息"); //读入要传输的字符 string str = Console.ReadLine(); //得到流 Stream stm = tclient.GetStream(); //发送字符串 ASCIIEncoding asen = new ASCIIEncoding(); byte[] data = asen.GetBytes(str); stm.Write(data, 0, data.Length); //接受服务器返回的消息 byte[] back = new byte[100]; int k = stm.Read(back, 0, 100); //输出服务器返回的消息 for (int i = 0; i < k; i++) { Console.Write(Convert.ToChar(back[i])); } //关闭连接 tclient.Close(); } } }
相关文章推荐
- linux下socket编程实现一个服务器连接多个客户端
- linux下socket编程实现一个服务器连接多个客户端
- Socket编程服务器和客户端(多个客户端可以同时连接一个服务器的同一端口)
- java网络编程----------Socket实现客户端和服务器的连接
- Android 使用Socket实现服务器与手机客户端的长连接四:使用回调函数与Service调用
- 什么是socket?什么是socket的长、短连接?java如何简单实现socket客户端和服务器?
- loadrunner使用socket协议来实现客户端对服务器产生压力实例。(通过发送心跳包,达到连接多个客户端的目的)
- Java Socket实现多个客户端连接同一个服务端
- Android 使用Socket实现服务器与手机客户端的长连接七:定义消息体,区分是响应还是回复信息
- 如何实现 客户端仅用一个IP地址,就可以连接到不同的服务器上
- 老板让我做一个socket服务器连接客户端和一个wifi?
- Android 使用Socket实现服务器与手机客户端的长连接七:定义消息体,区分是响应还是回复信息
- loadunner使用socket协议来实现多客户端连接同一服务器脚本(使用到IP欺骗技术)
- Java编程Socket实现多个客户端连接同一个服务端代码
- Socket 一个服务器监听多个客户端 功能实现
- 基于非阻塞socket的多线程服务器的实现------一个服务器如何与多个客户端进行通信?
- 多线程Socket编程实现服务器与客户端的连接
- Android 使用Socket实现服务器与手机客户端的长连接八
- 简单Socket实现客户端和服务器连接
- Android 使用Socket实现服务器与手机客户端的长连接二:多Client对一Server聊天