C# 소켓 스레드
원본은 이렇습니다. 링크를 열려면 클릭하세요. 하지만 제대로 조정된 적이 없어서 동료인 Xiang Ge와 상의하여 마침내 제대로 조정되었습니다!
클라이언트 코드:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Threading; using System.Net; using System.Diagnostics; namespace SocketClient { public partial class Client : Form { Socket vsServerSocket; Thread vsClientThread; string strIP = "127.0.0.1"; public delegate void PassString(string strMsg); int nPort = 9001; public Client() { InitializeComponent(); } public void SetSendData(string strMsg) { if (tBoxClientSend.InvokeRequired == true) { PassString d = new PassString(SetSendData); this.Invoke(d, new object[] { strMsg }); } else { tBoxClientSend.Text = strMsg; } } public void SetRecvData(string strMsg) { if (tBoxClientReceive.InvokeRequired == true) { PassString d = new PassString(SetRecvData); this.Invoke(d, new object[] { strMsg }); } else { tBoxClientReceive.Text = strMsg; } } private void ClientHandle() { string strRecv = string.Empty; //IPEndPoint其实就是一个IP地址和端口的绑定,可以代表一个服务,用来Socket通讯。 //IPAddress类中有一个 Parse()方法,可以把点分的十进制IP表示转化成IPAddress类 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(strIP), nPort); //创建套接字实例 //这里创建的时候用ProtocolType.Tcp,表示建立一个面向连接(TCP)的Socket vsServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { //将所创建的套接字与IPEndPoint绑定 vsServerSocket.Bind(ipep); } catch (SocketException ex) { MessageBox.Show("Connect Error: " + ex.Message); return; } Byte[] buffer = new Byte[1024]; //设置套接字为收听模式 vsServerSocket.Listen(10); //循环监听 while (true) { //接收服务器信息 int bufLen = 0; try { Socket vsClientSocket = vsServerSocket.Accept(); bufLen=vsClientSocket.Receive(buffer); vsClientSocket.Send(Encoding.ASCII.GetBytes("aaaaa"), 5, SocketFlags.None); } catch (Exception ex) { MessageBox.Show("Receive Error:" + ex.Message); } strRecv = Encoding.ASCII.GetString(buffer, 0, bufLen); SetRecvData(strRecv); //vsClientSocket.Shutdown(SocketShutdown.Both); //vsClientSocket.Close(); } } //发送数据 private void btnSend_Click(object sender, EventArgs e) { byte[] data = new byte[1024]; string ss = tBoxClientSend.Text; Socket centerClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint GsServer = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9002); centerClient.Connect(GsServer); centerClient.Send(Encoding.ASCII.GetBytes(ss)); centerClient.Close(); } private void Client_Load(object sender, EventArgs e) { //连接服务器 //通过ThreadStart委托告诉子线程讲执行什么方法 vsClientThread = new Thread(new ThreadStart(ClientHandle)); vsClientThread.Start(); } //窗体关闭时杀死客户端进程 private void Client_FormClosing(object sender, FormClosingEventArgs e) { KillProcess(); } //杀死客户端进程 private void KillProcess() { Process[] processes = Process.GetProcessesByName("SocketClient"); foreach (Process process in processes) { process.Kill(); break; } } } }
서버 코드:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Net.Sockets; using System.Net; using System.Diagnostics; namespace SocketServer { public partial class Server : Form { Thread vsServerThread; Socket vsServerSocket; string strIP = "127.0.0.1"; public delegate void PassString(string strMsg); int nPort = 9002; public Server() { InitializeComponent(); } private void SeverSendData(string strMsg) { //Control.InvokeRequired 属性,命名空间: System.Windows.Forms //获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。 if (tBoxServerSend.InvokeRequired == true) { //Control.Invoke 方法 (Delegate) //在拥有此控件的基础窗口句柄的线程上执行指定的委托。 PassString d = new PassString(SeverSendData); this.Invoke(d, new object[] { strMsg }); } else { tBoxServerSend.Text = strMsg; } } private void SeverRecvData(string strMsg) { if (tBoxServerReceive.InvokeRequired == true) { PassString d = new PassString(SeverRecvData); this.Invoke(d, new object[] { strMsg }); } else { tBoxServerReceive.Text = strMsg; } } private void ServerStart() { string strRecv = string.Empty; //创建IPEndPoint实例 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(strIP), nPort); //创建一个套接字 vsServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //将所创建的套接字与IPEndPoint绑定 try { vsServerSocket.Bind(ipep); } catch (Exception ee) { MessageBox.Show(ee.ToString()); return; } //设置套接字为收听模式 vsServerSocket.Listen(10); int bufLen = 0; //循环监听 while (true) { //在套接字上接收接入的连接 Socket vsClientSocket = vsServerSocket.Accept(); try { Byte[] buffer = new Byte[1024]; //在套接字上接收客户端发送的信息 bufLen = vsClientSocket.Receive(buffer); vsClientSocket.Send(Encoding.ASCII.GetBytes("aaaaa"), 5, SocketFlags.None); if (bufLen == 0) continue; //将指定字节数组中的一个字节序列解码为一个字符串。 strRecv = Encoding.ASCII.GetString(buffer, 0, bufLen); SeverRecvData(strRecv.ToString()); } catch (Exception ex) { MessageBox.Show("Listening Error: " + ex.Message); vsClientSocket.Close(); vsServerSocket.Close(); } } } private void btnSend_Click(object sender, EventArgs e) { byte[] data = new byte[1024]; string ss = tBoxServerSend.Text; Socket centerClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint GsServer = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9001); centerClient.Connect(GsServer); centerClient.Send(Encoding.ASCII.GetBytes(ss)); centerClient.Send(Encoding.ASCII.GetBytes(ss)); //Thread.Sleep(100); //centerClient.Close(); } private void Server_Load(object sender, EventArgs e) { vsServerThread = new Thread(new ThreadStart(ServerStart)); vsServerThread.Start(); } //窗体关闭时杀死客户端进程 private void Server_FormClosing(object sender, FormClosingEventArgs e) { KillProcess(); } //杀死客户端进程 private void KillProcess() { Process[] processes = Process.GetProcessesByName("Server"); foreach (Process process in processes) { process.Kill(); break; } } } }
효과는 다음과 같습니다.
클라이언트가 서버에 메시지를 보낼 수 있고, 서버도 클라이언트에 메시지를 보낼 수 있습니다.
단점:
이제 서버는 하나의 클라이언트에만 연결할 수 있습니다.
위 내용은 C# 소켓 스레드 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









C#을 사용한 Active Directory 가이드. 여기에서는 소개와 구문 및 예제와 함께 C#에서 Active Directory가 작동하는 방식에 대해 설명합니다.

C#의 난수 생성기 가이드입니다. 여기서는 난수 생성기의 작동 방식, 의사 난수 및 보안 숫자의 개념에 대해 설명합니다.

C#의 액세스 수정자에 대한 안내입니다. 예제 및 출력과 함께 C#의 액세스 한정자의 소개 유형에 대해 논의했습니다.

C# 데이터 그리드 뷰 가이드. 여기서는 SQL 데이터베이스 또는 Excel 파일에서 데이터 그리드 보기를 로드하고 내보내는 방법에 대한 예를 설명합니다.
