socket study

本文展示了如何使用C#创建一个简单的TCP服务器和客户端,涉及Socket类的方法如Accept、Listen、Bind,以及如何处理IP地址、端口绑定和数据传输。同时,提到了在控制台输出中文的编码设置问题。
摘要由CSDN通过智能技术生成

误区

socket.Accept(); 必须要先绑定IP节点

socket.Listen(10);也是必须先绑定IP 节点

listen 设置需要先设置

socket.Bind(endPoint); 先确定该端口是否占用

最好不用 中文,传递消息。

console 显示中文 需要在 mian 里添加

Console.OutputEncoding = Encoding.GetEncoding("gb2312");

服务端

static void Main(string[] args)

{

Console.OutputEncoding = Encoding.GetEncoding("gb2312");

server obj = new server();

obj = null;

}

客户端

static void Main(string[] args)

{

Console.OutputEncoding = Encoding.GetEncoding("gb2312");//.UTF8;//.GetEncoding("gb2312");

client obj = new client();

obj = null;

}

public class server {

private Socket socket;

private bool _IsListen;

//记录通信用的Socket

Dictionary<string, Socket> dic = new Dictionary<string, Socket>();

public server()

{

IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8900 );

socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

socket.Bind(endPoint);

socket.Listen(10);

EndPoint ep = (EndPoint)endPoint;

Thread thread = new Thread(AcceptInfo);

thread.Start(socket);

while (true)

{

string strmsg = Console.ReadLine();

if (strmsg == "exit") { break; }

else if (strmsg == "d") { }

else {

Console.WriteLine(dic.Count.ToString());

}

}

foreach (string key in dic.Keys)

{

dic[key].Close();

}

}

private void AcceptInfo(object o)

{

Socket socket = o as Socket;

while (true)

{

try

{

Socket clientSocket = socket.Accept();//如果客户端有请求,生成一个新的Socket

string point = clientSocket.RemoteEndPoint.ToString();

show(point + "连接客户端成功!");

dic.Add(point, clientSocket);

//接收消息

Thread th = new Thread(receiveMsg);

th.Start(clientSocket);

}

catch (Exception ex)

{

break;

}

}

socket.Close();

socket = null;

}

private void receiveMsg(object socket)

{

Socket clientSocket = socket as Socket;

while (true)

{

try

{

byte[] buffer = new byte[1024 * 1024];

int n = clientSocket.Receive(buffer);//接收过来的数据放到buffer

//字节转换成字符串

string words = Encoding.UTF8.GetString(buffer, 0, n);

Console.WriteLine(clientSocket.RemoteEndPoint.ToString() + ":" + words);

if (words == "exit")

{

dic.Remove(clientSocket.RemoteEndPoint.ToString());

break;

}

//处理事务 可以异步 实现 这里可以发送 服务器已接受到你信息 等等 友好信息 表示我收到了

byte[] msg = Encoding.UTF8.GetBytes("已收到message:" + words);

clientSocket.Send(msg);//发送数据,字节数组

}

catch {

break;

}

}

clientSocket.Shutdown(SocketShutdown.Both);

clientSocket.Close();

}

private void show(string str)

{

Console.WriteLine(str);

}

}

public class client

{

private Socket _Client;

private IPEndPoint endPoint;

public client()

{

endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8900);

_Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

_Client.Connect(endPoint);

show("服务器" + _Client.RemoteEndPoint.ToString());

show("客户端:" + _Client.LocalEndPoint.ToString());

//EndPoint ep = (EndPoint)endPoint;

while (true)

{

string strmsg = Console.ReadLine();

byte[] bytes = Encoding.UTF8.GetBytes(strmsg);

_Client.Send(bytes);

if (strmsg == "exit") { break; }

//定义byte数组存放从客户端接收过来的数据

byte[] buffer = new byte[1024 * 1024];

int n = _Client.Receive(buffer);//将接收过来的数据放到buffer中,并返回实际接受数据的长度

//将字节转换成字符串

string words = Encoding.UTF8.GetString(buffer, 0, n);

Console.WriteLine("received:" + strmsg);

}

_Client.Shutdown(SocketShutdown.Both);

_Client.Close();

}

private void show(string str)

{

Console.WriteLine(str);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值