来自我的阿里云 外网IP为39.106.215.68 需要在阿里云里开放一个你需要的端口,最好把入口和出口都设置一下并弄成一样的,我的开放端口为9000
服务端代码(采用控制台应用程序) PS:开始是winform,打包运行会出错,报什么socket thread错就用了控制台
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static Socket m_tcp_server;
static IPEndPoint endpoint;
static Thread thread;
//服务器本身的端口和IP
static string ip = "172.17.105.117"; //内置IP
static int port = 9000;
static void Main(string[] args)
{
m_tcp_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//实例化socket
endpoint = new IPEndPoint(IPAddress.Parse(ip), port);//需要绑定哪些IP和端口
if (m_tcp_server != null)
{
m_tcp_server.Bind(endpoint);//开始绑定
m_tcp_server.Listen(100);//可以监听100个客户端
Console.WriteLine("服务器开启成功,开始监听....");
m_tcp_server.BeginAccept(new AsyncCallback(Listen_client), m_tcp_server);//开始采用异步监听第一个客户端的链接
Console.ReadKey();
}
}
//监测客户端的链接
static void Listen_client(IAsyncResult iar)
{
Socket server = iar.AsyncState as Socket;
Socket client = server.EndAccept(iar); // 保存异步链接的客户端
Console.WriteLine("【系统提示:有新的客户端链接进来...】" + client.RemoteEndPoint);
Send(client, "欢迎来到卢本伟广场.");
thread = new Thread(Receive);
thread.IsBackground = true;
thread.Start(client);
m_tcp_server.BeginAccept(new AsyncCallback(Listen_client), m_tcp_server);//继续采用异步监听下一个客户端的链接
}
static void Receive(object obj)
{
Socket socket = obj as Socket;
while (true)
{
byte[] buffer = new byte[1024];
int len = 0;
try
{
//从客户端接收消息
len = socket.Receive(buffer, buffer.Length, 0);
}
catch (Exception ex)
{
Console.WriteLine(DateTime.Now.ToString() + " " + socket.RemoteEndPoint + ":退出...");
break;
}
// SendMsgToAll(resMsg);
//将消息转为字符串
string recvStr = Encoding.UTF8.GetString(buffer, 0, len);
Console.WriteLine(DateTime.Now.ToString() + " 接收的客户端消息 : {0}", (socket.RemoteEndPoint as IPEndPoint).Address + " " + (socket.RemoteEndPoint as IPEndPoint).Port.ToString() + recvStr);
}
}
static void Send(Socket socket, string str)
{
byte[] bytes = Encoding.UTF8.GetBytes(str);
//发送消息给客户端
socket.Send(bytes, bytes.Length, 0);
}
}
}
上面如何需要保存每个链接进来的客户端(支持listen里面的数字那么多的客户端同时链接--亲测),可以做一个List<Socket>把一个个添加一下,我没弄
客户端代码(使用的winform)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
Socket m_tcp_client1;
string host = "39.106.215.68"; //为我的阿里云外网IP
int port = 9000;
IPEndPoint ipe;
Thread thread;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
m_tcp_client1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//实例化socket
ipe = new IPEndPoint(IPAddress.Parse(host), port);
m_tcp_client1.Connect(ipe);
//开启线程监测
thread = new Thread(Listen_server);
thread.IsBackground = true;
thread.Start();
}
void Listen_server()
{
while(true)
{
try
{
byte[] bytes = new byte[1024];
//从客户端接收消息
int len = m_tcp_client1.Receive(bytes, bytes.Length, 0);
//将消息转为字符串
string recvStr = Encoding.UTF8.GetString(bytes, 0, len);
Console.WriteLine("接收的客户端消息 : {0}", m_tcp_client1.RemoteEndPoint + " "+recvStr);
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
string str = "";
private void button1_Click(object sender, EventArgs e)
{
try
{
str = "哈哈哈哈哈哈111";
byte[] bytes = Encoding.UTF8.GetBytes(str);
//发送消息给客户端
m_tcp_client1.Send(bytes, bytes.Length, 0);
}
catch (Exception ex)
{
Console.WriteLine("Error:" + ex);
}
}
//点击关闭窗口才会调用
private void m_closing(object sender, FormClosingEventArgs e)
{
//Console.WriteLine("关闭了");
if (m_tcp_client1 != null)
{
m_tcp_client1.Close();
m_tcp_client1 = null;
}
}
}
}
这个打包出来可以使用(客户端代码可以多台机器用,相当于很多的客户端)